ホームページ  >  記事  >  バックエンド開発  >  golang httpリクエストのタイムアウト

golang httpリクエストのタイムアウト

PHPz
PHPzオリジナル
2023-05-10 18:03:371417ブラウズ

Golang で HTTP アプリケーションを作成する場合、ネットワーク環境が不安定なため、HTTP リクエストのタイムアウトの問題が発生することがあります。

この記事では、ブロックや無限待機を防ぐために、Golang で HTTP リクエストのタイムアウトを設定する方法を紹介します。

HTTP リクエスト タイムアウトとは

HTTP リクエスト タイムアウトとは、クライアントがサーバーにリクエストを送信した後、所定の時間を超えて応答を待機し、リクエストがキャンセルされることを意味します。この状況は通常、ネットワークの遅延、高負荷、サーバー リソースの不足などで発生します。

Golang の HTTP アプリケーションの場合、応答がない場合、または要求の応答に時間がかかりすぎる場合、アプリケーションがブロックされて無制限に待機することを防ぐために、HTTP 要求のタイムアウトを設定する必要があります。

タイムアウトを設定する必要がある理由

Golang アプリケーションでは、各 HTTP リクエストはゴルーチンであり、ネットワークにリクエストを送信し、応答を待ちます。リクエストのタイムアウトが設定されていない場合、応答の待機中にプログラムがブロックされて無限ループに入り、サーバーの負荷が増加してパフォーマンスが低下する可能性があります。

さらに、アプリケーションに悪意のあるユーザーまたは攻撃者がいる場合、偽のリクエストを送信してアプリケーションの応答を長時間待機させ、サーバー リソースを使い果たす可能性があります。

したがって、HTTP リクエストのタイムアウトを設定すると、応答を受信するまでに多くの時間とリソースが無駄にならず、アプリケーションが攻撃されてリソースが不足するのを防ぐことができます。

Golang で HTTP リクエストのタイムアウトを設定する

Golang では、net/http ライブラリを使用して HTTP リクエストを送信し、タイムアウトを設定できます。このライブラリで定義されているクライアント タイプには、タイムアウトを設定できる Timeout プロパティがあります。

以下はサンプル コードです:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: time.Second * 5, // 设置超时时间为5秒
    }

    req, err := http.NewRequest(http.MethodGet, "https://www.example.com", nil)
    if err != nil {
        panic(err)
    }

    res, err := client.Do(req)
    if err != nil {
        panic(err)
    }

    fmt.Println(res)
}

このサンプル コードでは、HTTP クライアントを作成し、タイムアウトを 5 秒に設定します。次に、GET リクエストを https://www.example.com に送信し、応答を待ちます。リクエストがタイムアウトした場合、または応答に時間がかかりすぎた場合は、5 秒以内に終了します。

タイムアウト エラーの処理方法

上記のサンプル コードでは、パニック関数を使用して HTTP リクエストのタイムアウト エラーを処理します。ただし、実際のアプリケーションでは、タイムアウト エラーを処理するために、より信頼性の高い方法を使用する必要があります。

次は、より信頼性の高い方法です。リクエストにコンテキストを追加し、select ステートメントを使用してタイムアウトと通常の応答を処理します。

package main

import (
    "context"
    "fmt"
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: time.Second * 5, // 设置超时时间为5秒
    }

    req, err := http.NewRequest(http.MethodGet, "https://www.example.com", nil)
    if err != nil {
        panic(err)
    }

    ctx, cancel := context.WithTimeout(req.Context(), time.Second*5)
    defer cancel() // 在函数退出时取消Context

    req = req.WithContext(ctx) // 使用带有超时的Context创建新请求

    resp, err := client.Do(req)
    if err != nil {
        select {
        case <-ctx.Done(): // 超时错误
            fmt.Println("Request timed out")
        default: // 其他错误
            panic(err)
        }
    }

    defer resp.Body.Close()
    fmt.Println(resp.StatusCode)
}

このサンプル コードでは、コンテキストを作成し、 WithTimeout 関数を使用してタイムアウトを設定しました。次に、タイムアウトのあるコンテキストを使用して新しいリクエストを作成し、このリクエストを送信します。

リクエストがタイムアウトしたり、その他のエラーが発生した場合は、エラーの種類に応じて異なる処理方法が採用されます。これにより、アプリケーションをより詳細に制御し、エラー状況を適切に処理できるようになります。

概要

Golang で HTTP アプリケーションを作成する場合、ブロックや無限待機を避けるために、HTTP リクエストのタイムアウトを設定することが非常に重要です。 net/http ライブラリのクライアント タイプを使用してタイムアウトを設定できます。また、Context ステートメントと select ステートメントを使用して、タイムアウト エラーやその他のエラーを処理します。

高パフォーマンスで安定したアプリケーションを作成する場合は、実際の状況に基づいて適切なタイムアウトを設定する必要があります。これにより、制御されていない環境でもアプリケーションが適切に動作できるようになります。

以上がgolang httpリクエストのタイムアウトの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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