HTTP 処理実装では、リクエスト本文の検査は、フォームエンコードされたデータを含む POST リクエストなどの特定のリクエストを処理するために不可欠です。 。ただし、req.ParseForm() などのメソッドを使用して直接検査すると、リクエストの状態が中断され、リクエストをリバース プロキシに転送するときにエラーが発生する可能性があります。
この問題に対処するには、終了せずにリクエスト本文を参照することが可能です。元のリクエストオブジェクト内のすべてのトレース。これにより、リバース プロキシなどの後続のコンシューマに対して元の状態が維持されます。
効果的なアプローチの 1 つは、リクエスト本文を中間バッファに読み取り、そのバッファを使用して複数のリーダーを作成することです。以下のコード スニペットは、これを示しています。
// Read the request body into a buffer buf, _ := io.ReadAll(r.Body) // Create two readers from the buffer rdr1 := io.NopCloser(bytes.NewBuffer(buf)) rdr2 := io.NopCloser(bytes.NewBuffer(buf)) // Perform desired operations on the first reader doStuff(rdr1) // Reset the request body with the second reader r.Body = rdr2
このコードでは、bytes.NewBuffer(buf) は、格納されたバッファをラップするリーダーを作成します。 io.NopCloser は、Close() メソッドがエラーを返さないようにします。これは、リーダーが io.ReadCloser インターフェイスを実装するために必要です。
コード スニペットは、質問に示されている例では、 doStuff() はリクエスト本文を処理する関数です:
buf, _ := io.ReadAll(r.Body) rdr1 := io.NopCloser(bytes.NewBuffer(buf)) rdr2 := io.NopCloser(bytes.NewBuffer(buf)) doStuff(rdr1) r.Body = rdr2
この変更により、リクエスト本文は、元のリクエストの状態に影響を与えることなく検査できます。リバース プロキシは、変更されていない本文でリクエストの処理を続行できます。
以上がリクエストの状態を変更せずに HTTP リクエストの本文を検査するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。