ホームページ >バックエンド開発 >Golang >Go でロングポーリング HTTP リクエストをキャンセルするにはどうすればよいですか?

Go でロングポーリング HTTP リクエストをキャンセルするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-01 00:10:15913ブラウズ

How Can I Cancel a Long-Polling HTTP Request in Go?

Golang でのロングポーリングリクエストのキャンセル

http.Client を使用してクライアント側のロングポーリングを実装する場合、多くの場合、これが望ましいですリクエストを途中でキャンセルできるようになります。これは、別の goroutine から resp.Body.Close() を手動で呼び出すことで実現できますが、これは標準的で洗練されたソリューションではありません。

リクエスト コンテキストを使用したキャンセル

Golang で HTTP リクエストをキャンセルするより慣用的な方法は、リクエスト コンテキストを使用することです。期限付きのコンテキストやキャンセル関数を渡すことで、クライアント側からリクエストをキャンセルすることができます。次のコードは、リクエスト コンテキストを使用してロング ポーリング リクエストをキャンセルする方法を示しています。

import (
    "context"
    "net/http"
)

func main() {
    // Create a new HTTP client with a custom transport.
    client := &http.Client{
        Transport: &http.Transport{
            // Set a timeout for the request.
            Dial: (&net.Dialer{Timeout: 5 * time.Second}).Dial,
            TLSHandshakeTimeout: 5 * time.Second,
        },
    }

    // Create a new request with a context that can be cancelled.
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

    req, err := http.NewRequest("POST", "http://example.com", nil)
    if err != nil {
        panic(err)
    }
    req = req.WithContext(ctx)

    // Start the request in a goroutine and cancel it after 5 seconds.
    go func() {
        _, err := client.Do(req)
        if err != nil {
            // Handle the canceled error.
        }
    }()

    time.Sleep(5 * time.Second)
    cancel()
}

cancel() 関数が呼び出されると、リクエストはキャンセルされ、トランスポートで Dial と TLSHandshakeTimeout が指定されます。尊重されます。

以上がGo でロングポーリング HTTP リクエストをキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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