Go でリクエスト本文から JSON を取得する
JSON コンテンツを含む POST リクエストを操作する場合、JSON データを抽出する必要があります。リクエストの本文から。ただし、これは、Node.js などの言語からコードを移行している Go 初心者にとっては不可解な作業になる可能性があります。
この問題に対処するために、次のようないくつかのアプローチが試みられています。
var v インターフェース{}<br>err := json.NewDecoder(context.Request().Body).Decode(&v)<br>if err != nil {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><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> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><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> <div class="code" style="position:relative; padding:0px; margin:0px;"><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 サイトの他の関連記事を参照してください。