HTTP ルーティングのために Go-chi を使用する場合、多くの場合、複数のハンドラー間でリクエスト本文を再利用する必要があります。ただし、リクエスト本文を 1 回しか読み取ることができない場合に、一般的な課題が発生します。
たとえば、次のコードを考えてみましょう。
func Registration(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // read request body // ...other code user.Create(w, r) } ... func Create(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // ...other code }
この例では、登録ハンドラーがリクエスト本文を読み取ります。 ioutil.ReadAllを使用します。 Create ハンドラーが呼び出されると、本文の再読み取りが試行され、JSON 入力の予期せぬ終了エラーが発生します。
ここでの根本的な問題は、ReadAll への最初の呼び出しでリクエスト本文が使い果たされることです。この問題を解決するには、以前に読み取られたデータを使用してリクエスト本文を復元する必要があります。次のコードは、その方法を示しています。
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) }
この改訂されたコードでは、io.ReadAll を使用してリクエスト本文を読み取り、呼び出し前に bytes.NewReader 関数と io.NopCloser 関数を使用してリクエスト本文が復元されます。ユーザーを作成します。これにより、リクエスト本文が後続のハンドラーで効果的に使用できるようになります。
以上がGo-chi ミドルウェアで HTTP リクエストボディを再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。