Go 言語における http.Transport のリクエスト タイムアウト設定とベスト プラクティス
Go 言語では、http.Transport は重要なネットワーク リクエスト ライブラリです。開発者がリクエストの実行時間をより適切に制御し、リソースの無駄を回避できるように、リクエストのタイムアウトを設定するための一連のメソッドとオプションが提供されます。この記事では、リクエストのタイムアウトを設定する方法を説明し、ベスト プラクティスとしていくつかのサンプル コードを示します。
http.Transport では、次の 2 つの方法を使用してリクエストのタイムアウトを設定できます。
Timeout は http.Transport のフィールドで、タイプは time.Duration です。タイムアウトを設定すると、接続の確立、リクエストの送信、レスポンスの受信などのすべてのプロセスを含むリクエスト全体のタイムアウトを指定できます。例は次のとおりです。
package main import ( "net/http" "time" ) func main() { transport := &http.Transport{ // 设置请求超时时间为5秒 Timeout: 5 * time.Second, } client := &http.Client{ Transport: transport, } resp, err := client.Get("http://example.com") if err != nil { // 处理错误 return } // 处理响应 defer resp.Body.Close() }
Deadline は http.Request のフィールドで、タイプは time.Time です。期限を設定することで、1 つのリクエストに対して独立したタイムアウトを設定できます。例は次のとおりです。
package main import ( "net/http" "time" ) func main() { req, err := http.NewRequest("GET", "http://example.com", nil) if err != nil { // 处理错误 return } // 设置请求超时时间为5秒 req.Header.Set("Timeout", "5s") req = req.WithContext(http.TimeoutContext(req.Context(), 5*time.Second)) client := &http.Client{} resp, err := client.Do(req) if err != nil { // 处理错误 return } // 处理响应 defer resp.Body.Close() }
実際の開発では、特定のシナリオとニーズに従ってリクエスト タイムアウトを設定する必要があります。以下は、いくつかのベスト プラクティスのサンプル コードです。
アプリケーション時間全体を通じて、すべてのリクエストに対してグローバル デフォルト タイムアウトを設定できます。これにより、コードの可読性と保守性が向上します。例は次のとおりです。
package main import ( "net/http" "time" ) var client = &http.Client{ Transport: &http.Transport{ // 设置全局默认超时时间为10秒 Timeout: 10 * time.Second, }, } func main() { resp, err := client.Get("http://example.com") if err != nil { // 处理错误 return } // 处理响应 defer resp.Body.Close() }
異なるリクエストに対して、異なるタイムアウトを設定できます。たとえば、さまざまな API インターフェイスに対して、インターフェイスの特性と応答時間の要件に従ってタイムアウトを設定できます。例は次のとおりです。
package main import ( "net/http" "time" ) func main() { apiA := &http.Client{ Transport: &http.Transport{ // 设置API A的超时时间为3秒 Timeout: 3 * time.Second, }, } apiB := &http.Client{ Transport: &http.Transport{ // 设置API B的超时时间为5秒 Timeout: 5 * time.Second, }, } respA, err := apiA.Get("http://apiA.example.com") if err != nil { // 处理错误 return } respB, err := apiB.Get("http://apiB.example.com") if err != nil { // 处理错误 return } // 处理响应 defer respA.Body.Close() defer respB.Body.Close() }
この記事では、Go 言語で http.Transport のリクエスト タイムアウトを設定する方法を紹介し、いくつかのベスト プラクティス サンプル コードを示します。実際の開発では、特定のニーズやシナリオに応じてリクエストのタイムアウトを柔軟に設定することで、アプリケーションのパフォーマンスと信頼性を向上させることができます。
以上がGo 言語での http.Transport のリクエスト タイムアウト設定とベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。