Go での HTTP リクエストボディによるクライアントのキャンセル
HTTP リクエストを処理するときは、クライアントのキャンセル信号に適切に応答できることが重要です。リソース管理。 Go のコンテキスト パッケージはキャンセルをキャプチャするメカニズムを提供しますが、特定のシナリオでは期待どおりに動作しない場合があります。
GET リクエストと POST リクエストが異なる理由
GET の動作の違いPOST リクエストは、HTTP によるリクエストの処理方法に由来します。 server.
リクエストボディを使用したキャンセルのキャプチャ
ボディを使用したリクエストのキャンセルシグナルをキャプチャするには、リクエストボディの読み取りをすぐに開始することが重要です。 Go の http サーバーは、アプリケーションがリクエスト本文を読み取るときにのみ閉じられた接続をチェックします。
解決策:
キャンセル シグナルができるだけ早くキャプチャされるようにするには、リクエストハンドラーは、リクエスト本文の読み取りを直ちに開始します:
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) io.Copy(ioutil.Discard, r.Body) // Read the body to detect closed connections time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
このソリューションは、リクエスト本文の読み取りを開始し、閉じられた接続を確認します。同時に、リクエストの種類に関係なくキャンセル信号のキャプチャを有効にします。
以上がGo はボディを含む HTTP リクエストでのクライアントのキャンセルをどのように処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。