ホームページ >バックエンド開発 >Golang >Go 言語での http.Transport のリクエスト タイムアウト設定とベスト プラクティス

Go 言語での http.Transport のリクエスト タイムアウト設定とベスト プラクティス

王林
王林オリジナル
2023-07-22 16:13:131771ブラウズ

Go 言語における http.Transport のリクエスト タイムアウト設定とベスト プラクティス

Go 言語では、http.Transport は重要なネットワーク リクエスト ライブラリです。開発者がリクエストの実行時間をより適切に制御し、リソースの無駄を回避できるように、リクエストのタイムアウトを設定するための一連のメソッドとオプションが提供されます。この記事では、リクエストのタイムアウトを設定する方法を説明し、ベスト プラクティスとしていくつかのサンプル コードを示します。

タイムアウト設定方法

http.Transport では、次の 2 つの方法を使用してリクエストのタイムアウトを設定できます。

  1. タイムアウト フィールドを使用する

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()
}
  1. Deadline フィールドの使用

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()
}

ベスト プラクティス

実際の開発では、特定のシナリオとニーズに従ってリクエスト タイムアウトを設定する必要があります。以下は、いくつかのベスト プラクティスのサンプル コードです。

  1. グローバル デフォルト タイムアウトの設定

アプリケーション時間全体を通じて、すべてのリクエストに対してグローバル デフォルト タイムアウトを設定できます。これにより、コードの可読性と保守性が向上します。例は次のとおりです。

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()
}
  1. 異なるタイムアウトの設定

異なるリクエストに対して、異なるタイムアウトを設定できます。たとえば、さまざまな 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。