Go-chi ミドルウェア ハンドラーでの HTTP リクエスト本文の再利用
HTTP ルーティングに go-chi を使用する場合、コードを複数で再利用すると便利ですハンドラー。ただし、ハンドラーがリクエスト本文データに依存している場合、予期しない問題が発生する可能性があります。
次のシナリオを考えてみましょう:
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 }
この例では、Registration ハンドラーと Create ハンドラーの両方が読み取りを試みます。 ioutil.ReadAll を使用してリクエスト本文を作成します。ただし、Registration は本文を最後まで読み取るため、Create が呼び出されたときに読み取るデータは残りません。
この問題を解決するには、外部ハンドラー (Registration) は、以前に読み取られたデータを使用してリクエスト本文を復元する必要があります。これは、次のコードを使用して実現できます。
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 に変換します。 r.Body に必要な ReadCloser インターフェイス。 r.Body を元のデータでリセットすると、Create は期待どおりにリクエスト本文にアクセスして解析できるようになります。
以上がGo-chi ミドルウェア ハンドラー間で HTTP リクエスト本文データを再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。