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 サイトの他の関連記事を参照してください。