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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 11:19:10348ブラウズ

How Can I Reuse an HTTP Request Body in Go Middleware Handlers?

Go ミドルウェア ハンドラーでの HTTP リクエスト本文の再利用

Go の net/http パッケージでは、ミドルウェア ハンドラーは、受信したメッセージを処理および変更する便利な方法を提供します。実際のアプリケーション コードで処理される前の 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
}

このシナリオではの場合、登録ハンドラーはリクエストの本文を変数 b に読み取り、リクエスト r を user.Create ハンドラーに渡し、再度本文の読み取りを試みます。ただし、本文はすでに登録ハンドラーによって使用されているため、エラーが発生します。

この問題の解決策は簡単です。要求本文を読み取った後、外側のハンドラーで要求本文を復元します。これは、bytes.NewReader() 関数と io.NopCloser 関数を使用して実現できます。

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.NopCloser 関数を変換します。 .Reader を r.Body に必要な io.ReadCloser タイプに変換します。ボディを復元することで、後続のハンドラーは元のリクエスト データにアクセスできるようになります。

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

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