ホームページ > バックエンド開発 > Golang > Go Chi ミドルウェア ハンドラーで HTTP リクエスト本文を再利用するにはどうすればよいですか?

Go Chi ミドルウェア ハンドラーで HTTP リクエスト本文を再利用するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-05 02:58:08
オリジナル
724 人が閲覧しました

How to Reuse HTTP Request Bodies in Go Chi Middleware Handlers?

Go Chi ミドルウェア ハンドラーでの HTTP リクエスト ボディの再利用

Go で go-chi HTTP ルーターを使用すると、次のような状況が発生する可能性があります。複数のミドルウェア ハンドラーでリクエスト本文を再利用する必要がある場合。次のコード スニペットは、この問題が発生するシナリオを示しています。

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created   
    // ...other code

    // if all good then create new user
    user.Create(w, r)
}

...

func Create(w http.ResponseWriter, r *http.Request) {
  b, err := ioutil.ReadAll(r.Body)  
  // ...other code

  // ... there I get the problem with parse JSON from &b
}
ログイン後にコピー

登録ハンドラーは、リクエスト本文を読み取って処理しようとします。ただし、この手順の後、Create ハンドラーが呼び出されるとき、リクエスト本文が空であるため、リクエスト本文からの JSON の解析に失敗します。これは、外側のハンドラーがリクエスト本文を最後まで読み取って、内側のハンドラーに読み取るものが何も残らないために発生します。

この問題を解決するには、外側のハンドラーで以前に読み取られたデータを復元して、リクエスト本文を復元する必要があります。 。次のコード スニペットは、これを実現する方法を示しています。

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := io.ReadAll(r.Body) 
    // ...other code
    r.Body = io.NopCloser(bytes.NewReader(b))
    user.Create(w, r)
}
ログイン後にコピー

このコードでは、bytes.NewReader 関数はバイト スライスの io.Reader を返します。次に、io.NopCloser 関数は、io.Reader を r.Body に必要な io.ReadCloser に変換します。リクエスト本文を復元すると、後続のハンドラーはそのコンテンツにアクセスし、期待どおりに処理できるようになります。

以上がGo Chi ミドルウェア ハンドラーで HTTP リクエスト本文を再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート