Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Amalan terbaik untuk pengurusan tamat masa dalam bahasa Go http.Transport

Amalan terbaik untuk pengurusan tamat masa dalam bahasa Go http.Transport

WBOY
WBOYasal
2023-07-23 12:18:201163semak imbas

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.

  1. 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.RequestTimeout字段来设置单个请求的超时时间。例如:

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错误。

  1. 超时处理:
    当请求发生超时时,我们应该合理地处理这个错误。一种常见的方式是使用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.DeadlineExceededrrreee

Dalam kod di atas, Tamat masa menunjukkan bahawa tamat masa keseluruhan permintaan ialah 10 saat Apabila masa pemprosesan permintaan melebihi 10 saat, permintaan akan mengembalikan ralat net.DialTimeout.


Selain itu, kami juga boleh menggunakan medan 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 melalui req.Timeout Apabila masa pemprosesan permintaan melebihi 5 saat, permintaan akan kembali a net.DialTimeoutRalat.
    1. Pengendalian tamat masa:
    2. Apabila permintaan tamat, kami harus mengendalikan ralat ini dengan munasabah. Cara biasa ialah menggunakan pakej context untuk mengawal tamat masa permintaan. Kita boleh mencipta context.Context dengan tamat masa dan menyerahkannya kepada http.Request permintaan. Contohnya:
    3. rrreee
    4. Dalam kod di atas, kami mencipta context.Context dengan tamat masa 10 saat melalui context.WithTimeout dan menggunakan http.NewRequestWithContext <code>Context diserahkan kepada permintaan.
    Apabila menghantar permintaan, kami boleh menggunakan 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!

    Kenyataan:
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn