Amalan terbaik untuk pengurusan tamat masa dalam bahasa Go http.Transport
Pengenalan:
Apabila menggunakan bahasa Go untuk membuat permintaan rangkaian, adalah sangat penting untuk menetapkan tamat masa secara munasabah untuk mengelakkan penyekatan permintaan dan pembaziran sumber. Artikel ini akan memperkenalkan amalan terbaik menggunakan http.Transport untuk pengurusan tamat masa dalam bahasa Go dan menyediakan beberapa contoh kod untuk rujukan.
Tetapkan tamat masa:
Sebelum menghantar permintaan menggunakan http.Transport, kami boleh menggunakan beberapa kaedah untuk menetapkan tamat masa permintaan. Sebagai contoh, kita boleh menggunakan medan Timeout
struktur http.Client
untuk menetapkan tamat masa untuk keseluruhan permintaan, contohnya: http.Client
结构体的Timeout
字段来设置整个请求的超时时间,例如:
client := &http.Client{ Timeout: time.Second * 10, // 设置超时时间为10秒 }
上述代码中,Timeout
字段表示整个请求的超时时间为10秒,当请求的处理时间超过10秒时,该请求将会返回一个net.DialTimeout
错误。
此外,我们还可以在使用http.Transport
发送请求之前,使用http.Request
的Timeout
字段来设置单个请求的超时时间。例如:
req, err := http.NewRequest("GET", "http://example.com", nil) if err != nil { log.Fatal(err) } req.Header.Set("Content-Type", "application/json") req.Header.Set("User-Agent", "MyClient/1.0") req.Timeout = time.Second * 5 // 设置单个请求的超时时间为5秒 resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body))
上述代码中,我们通过req.Timeout
将单个请求的超时时间设置为5秒,当请求的处理时间超过5秒时,该请求将会返回一个net.DialTimeout
错误。
超时处理:
当请求发生超时时,我们应该合理地处理这个错误。一种常见的方式是使用context
包来控制请求的超时。我们可以创建一个带有超时时间的context.Context
,并将其传递给请求的http.Request
。例如:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() req, err := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil) if err != nil { log.Fatal(err) }
上述代码中,我们通过context.WithTimeout
创建了一个带有10秒超时时间的context.Context
,并使用http.NewRequestWithContext
将该Context
传递给了请求。
在发送请求时,我们可以使用context.Context
来监控超时事件。例如:
resp, err := client.Do(req.WithContext(ctx)) if err != nil { if err == context.DeadlineExceeded { log.Println("请求超时") return } log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body))
上述代码中,当请求超时发生时,我们会通过判断错误类型是否为context.DeadlineExceeded
rrreee
net.DialTimeout
. Timeout
http.Request
sebelum menghantar permintaan menggunakan http.Transport
Tetapkan tamat masa untuk satu permintaan. Contohnya: rrreee
Dalam kod di atas, kami menetapkan tamat masa satu permintaan kepada 5 saat melaluireq.Timeout
Apabila masa pemprosesan permintaan melebihi 5 saat, permintaan akan kembali a net.DialTimeout
Ralat. context
untuk mengawal tamat masa permintaan. Kita boleh mencipta context.Context
dengan tamat masa dan menyerahkannya kepada http.Request
permintaan. Contohnya: context.Context
dengan tamat masa 10 saat melalui context.WithTimeout
dan menggunakan http.NewRequestWithContext <code>Context
diserahkan kepada permintaan.
context.Context
untuk memantau acara tamat masa. Contohnya: rrreee🎜Dalam kod di atas, apabila tamat masa permintaan berlaku, kami akan mengendalikan acara tamat masa dengan menentukan sama ada jenis ralat ialah context.DeadlineExceeded
. Jika ia adalah peristiwa tamat masa, kami boleh melakukan beberapa operasi pemprosesan yang sepadan, seperti mengembalikan maklumat ralat atau mencuba semula permintaan. 🎜🎜Ringkasan: 🎜Apabila menggunakan bahasa Go untuk membuat permintaan rangkaian, adalah sangat penting untuk menetapkan tamat masa yang munasabah. Artikel ini memperkenalkan amalan terbaik untuk pengurusan tamat masa menggunakan http.Transport dalam bahasa Go dan menyediakan beberapa kod sampel. Dengan menetapkan tamat masa dengan sewajarnya dan menggunakan konteks.Konteks untuk memantau peristiwa tamat masa, kami boleh mengurus tamat masa permintaan dengan lebih baik dan meningkatkan kestabilan dan kebolehpercayaan program. 🎜🎜Rujukan: 🎜🎜🎜https://golang.org/pkg/net/http/🎜🎜https://golang.org/pkg/net/http/#Client🎜🎜https://golang.org/ pkg /context/🎜🎜https://github.com/dgrijalva/jwt-go🎜🎜Atas ialah kandungan terperinci Amalan terbaik untuk pengurusan tamat masa dalam bahasa Go http.Transport. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!