クライアントとサーバーの接続が長期間維持されるロングポーリングのコンテキストでは、クライアント側からリクエストを途中で終了する必要が生じます。 http.Client ライブラリはロングポーリングに対するデフォルトのブロック動作を提供しますが、応答が完全に受信される前に POST リクエストをキャンセルまたは中止するにはどうすればよいでしょうか?
resp.Body を呼び出す従来のアプローチ応答を途中で閉じる .Close() は、別のゴルーチンによる追加のオーケストレーションが必要となるため、推奨されません。さらに、http.Transport のタイムアウト機能の使用は、ユーザーによるキャンセルの必要性と一致しない可能性があります。
幸いなことに、Go エコシステムは、http.Request.WithContext を介してより合理化されたソリューションを提供するように進化しました。これにより、クライアントはリクエストに対して時間制限のあるコンテキストを指定できるようになり、外部イベントに応じて正常に終了できるようになります。以下のコード スニペットは、このアプローチを示しています。
// Create a new request with an appropriate context, using a deadline to terminate after a specific duration. req, err := http.NewRequest("POST", "http://example.com", nil) ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second)) req = req.WithContext(ctx) err = client.Do(req) if err != nil { // Handle the error, which may indicate a premature termination due to the context deadline. }
コンテキスト オブジェクトで cancel() を呼び出すことで、いつでもリクエストを中止し、ロング ポーリングの終了をトリガーできます。これにより、ユーザー制御による HTTP POST リクエストのキャンセルのための信頼性が高く効率的なメカニズムが提供されます。
以上がGo でロングポーリング POST リクエストを中止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。