ホームページ >バックエンド開発 >Golang >Go-Gin リクエストボディを複数回読み取るにはどうすればよいですか?

Go-Gin リクエストボディを複数回読み取るにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-28 17:04:11895ブラウズ

How to Read a Go-Gin Request Body Multiple Times?

Go-Gin: リクエスト本文を複数回読み取る

Go-Gin では、アクセスする必要がある場合、リクエスト本文を読み取るのが難しい場合があります。それを何度も。この問題は、ミドルウェアがリクエストの本文を変更し、その後のアクセスが困難になる場合に発生します。

次のシナリオを考えてみましょう。検証のために本文を読み取る検証ミドルウェアがあり、その後に未変更の本文を必要とする別のハンドラーが続きます。この場合、ミドルウェアの変更により、後続のハンドラーによる元の本文へのアクセスが妨げられます。

この問題を解決するには、次のアプローチを使用できます。

  1. リクエスト本文を読み込むミドルウェアに渡す前に変数:
bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
  1. 本体変数を渡す
if err := c.ShouldBindJSON(&user); err != nil {
    // Validation logic
}
  1. 検証後、io.NopCloser を使用して元の本体を復元します:
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(ByteBody))
  1. bodyBytes 変数には元の未変更の本文が含まれており、後続のハンドラーでそれを何もせずに使用できます。

提供されたコードでこの解決策を実装するには、ミドルウェア内の次の行:

// var bodyBytes []byte
// if c.Request.Body != nil {
//  bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
// }

を次の行に置き換えます:

bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

以上がGo-Gin リクエストボディを複数回読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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