ホームページ  >  記事  >  バックエンド開発  >  コンテンツを失わずに、Go でリクエスト本文から JSON を読み取る方法は?

コンテンツを失わずに、Go でリクエスト本文から JSON を読み取る方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-02 08:43:02139ブラウズ

How to Read JSON from the Request Body in Go Without Losing its Content?

Go でリクエスト本文から JSON を読み取る

Web アプリケーションで HTTP リクエストを処理する場合、多くの操作でリクエスト本文をキャプチャすることが不可欠です。 Go では、このタスクを達成するためのいくつかのアプローチがあります。

次のシナリオを考えてみましょう。POST リクエストの生の JSON 本文を取得し、データベースに保存する必要があります。これを行うには、本体の元の状態を保存する必要があります。

問題:

json.NewDecoder を使用して本体を直接デコードしようとしたり、構造体にバインドしようとすると、 http.Request.Body は複数回読み取ることができないバッファとしての性質があるため、空の結果またはエラーが発生します。

解決策:

キャプチャするには元の状態を維持しながらリクエスト本文を読み込むには、段階的な解決策を次に示します:

  1. 本文の内容を読み取る: ioutil.ReadAll を使用して本文の内容をバイトに読み取ります。 array.
  2. ボディを復元します: バイト配列の周囲に新しい ioutil.NopCloser を作成し、それを context.Request().Body.
  3. に割り当て直します。処理を続行します: これで、構造体へのバインドや他の操作の実行など、リクエスト本文の使用を続けることができます。

コード例:

<code class="go">// Read the Body content
var bodyBytes []byte
if context.Request().Body != nil {
    bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
}

// Restore the io.ReadCloser to its original state
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

// Continue to use the Body, like Binding it to a struct:
order := new(models.GeaOrder)
error := context.Bind(order)</code>

出典:

  • http://grokbase.com/t/gg/golang-nuts/12adq8a2ys/go-nuts-re-reading-http -response-body-or-any-reader
  • https://medium.com/@xoen/golang-read-from-an-io-readwriter-without-loosing-its-content-2c6911805361

以上がコンテンツを失わずに、Go でリクエスト本文から JSON を読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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