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 サイトの他の関連記事を参照してください。