ホームページ >バックエンド開発 >Golang >golang httpで接続を閉じる方法

golang httpで接続を閉じる方法

PHPz
PHPzオリジナル
2023-04-05 14:35:551302ブラウズ

Golang の人気が高まるにつれて、その HTTP ライブラリもますます人気が高まっています。ただし、場合によっては、HTTP リクエスト中に接続を閉じる必要があります。この時、私たちは何をすべきでしょうか?

まず、HTTP 接続のライフサイクルを見てみましょう。クライアントが HTTP リクエストをサーバーに送信すると、TCP 接続が作成されます。サーバーはこのリクエストを受信すると、HTTP レスポンスを返します。 HTTP 応答の最後に、「Connection: close」ヘッダーが送信されます。これにより、接続が閉じられたことと、応答を読んだ後に接続を閉じる必要があることがクライアントに伝えられます。このプロセスを「ショート接続」と呼びます。

クライアントが応答全体を読まない場合、クライアントは接続されたままになり、応答の読み取りを続けます。これを「ロングコネクション」といいます。この場合、クライアントは応答を読み取った後、明示的に接続を閉じる必要があります。

それでは、Golang で接続を閉じるにはどうすればよいでしょうか?

まず、http.Client を使用して接続を閉じます。これは、リクエストにタイムアウトを設定することで実現できます。短い接続の場合は、タイムアウトを 0 秒に設定できます。これにより、クライアントは応答を読み取った後すぐに接続を閉じます。

たとえば、次のコードを使用して接続を閉じることができます:

import (
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: time.Second * 0,
    }

    req, err := http.NewRequest("GET", "http://example.com", nil)
    if err != nil {
        // handle error
    }

    resp, err := client.Do(req)
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()

    // read response
}

長時間の接続が必要な場合は、タイムアウトを設定するときにその値を非常に大きな値に設定する必要があります。たとえば、次のコードを使用して接続状態を維持できます。

import (
    "net/http"
    "time"
)

func main() {
    client := http.Client{
        Timeout: time.Second * 600,
    }

    req, err := http.NewRequest("GET", "http://example.com", nil)
    if err != nil {
        // handle error
    }

    resp, err := client.Do(req)
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()

    // read response
}

接続を閉じる別の方法は、context.Context を使用することです。このアプローチにより、複数の HTTP リクエスト間でコンテキスト情報を共有できるようになり、リクエストのキャンセルやタイムアウトに使用できます。

以下は、context.Context を使用して接続を閉じるためのサンプル コードです。

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

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()

    req, err := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)
    if err != nil {
        // handle error
    }

    client := http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()

    // read response
}

上記のコードでは、WithTimeout メソッドを使用して、タイムアウトが 1 秒のコンテキストを作成します。次に、NewRequestWithContext メソッドを使用して、リクエストにコンテキストを割り当てます。次に、http.Client を使用してリクエストを実行し、最後に応答本文を閉じます。

概要

この記事では、Golang で HTTP 接続を閉じる方法を紹介しました。 HTTP 接続のライフ サイクルと、http.Client と context.Context を使用して接続を終了する方法について説明しました。短い接続でも長い接続でも、Golang では実際の HTTP 接続を閉じることができます。

以上がgolang httpで接続を閉じる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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