首頁 > 後端開發 > Golang > 主體

如何從 Go 中的請求正文中檢索 JSON 資料?

Linda Hamilton
發布: 2024-10-31 10:34:06
原創
515 人瀏覽過

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 {<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 {<pre class="brush:php;toolbar:false">return result, err
登入後複製

}
fmt.Println(m)

這裡,程式碼會產生錯誤訊息「EOF 」。發生此錯誤的原因是請求中沒有 content-type header,因此 Echo 無法確定傳送的資料類型。

最後嘗試直接讀取正文:

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 { <pre class="brush:php;toolbar:false">bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
登入後複製

}

// 將io.ReadCloser 恢復到原始狀態
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

// 繼續使用Body,就像將其綁定到結構體一樣:
order := new(models.GeaOrder)
error := context.Bind(order)

透過此解決方法,現在可以讀取正文、保留其內容以供以後使用,並將其資料成功綁定到結構。

以上是如何從 Go 中的請求正文中檢索 JSON 資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板