ホームページ >バックエンド開発 >Golang >Go でリクエスト本文から JSON データを取得するにはどうすればよいですか?

Go でリクエスト本文から JSON データを取得するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 10:34:06580ブラウズ

How to Retrieve JSON Data from a Request Body in Go?

Go でリクエスト本文から JSON を取得する

JSON コンテンツを含む POST リクエストを操作する場合、JSON データを抽出する必要があります。リクエストの本文から。ただし、これは、Node.js などの言語からコードを移行している Go 初心者にとっては不可解な作業になる可能性があります。

この問題に対処するために、次のようないくつかのアプローチが試みられています。

var v インターフェース{}<br>err := json.NewDecoder(context.Request().Body).Decode(&v)<br>if err != nil {</p>
<pre class="brush:php;toolbar:false">return result, err

}
fmt .Println(v)

この例では、結果は多くの場合空になり、本文が空であることを示します。これは、http.Request.Body がバッファであり、一度そこからデータが読み取られると、再度読み取ることができないためです。

別のアプローチは次のとおりです。

m := echo .Map{}<br>if err := context.Bind(&m); err != nil {</p>
<pre class="brush:php;toolbar:false">return result, err

}
fmt.Println(m)

ここで、コードの結果は「EOF」というエラー メッセージになります。 。」このエラーは、リクエストに content-type ヘッダーがないため、Echo が送信されるデータのタイプを判断できないために発生します。

最後に、本文を直接読み取ろうとします。

< pre>body, error := ioutil.ReadAll(context.Request().Body)
if error != nil {

return result, error

}
fmt.Println(body)

ioutil.ReadAll() がリクエスト本文を消費するため、結果は空のバイト配列になります。

解決策は、http.Request.Body の性質を理解することにあります。バッファを確保し、読み取り後にそれを復元する方法を見つけます。次のコード スニペットは回避策を提供します。

// 本文の内容を読み取ります<br>var bodyBytes []byte<br>if context.Request().Body != nil {</p> <pre class="brush:php;toolbar:false">bodyBytes, _ = ioutil.ReadAll(context.Request().Body)

}

// io.ReadCloser を元の状態に復元します
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

// ボディを構造体にバインドするなど、ボディの使用を続けます:
order := new(models.GeaOrder)
error := context.Bind(order)

この回避策により、本文を読み取り、その内容を後で使用できるように保存し、そのデータを構造体に正常にバインドできるようになりました。

以上がGo でリクエスト本文から JSON データを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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