3 回答

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
正如該方法的GoDoc 中http.Request.ParseForm
所述,正文的類(lèi)型必須是?application/x-www-form-urlencoded
,而不是像當(dāng)前示例那樣的 JSON:
對(duì)于其他 HTTP 方法,或者當(dāng) Content-Type 不是 application/x-www-form-urlencoded 時(shí),不會(huì)讀取請(qǐng)求 Body,并且 r.PostForm 被初始化為一個(gè)非 nil 的空值。
如果您想從 JSON 正文中提取值,可以使用諸如 之類(lèi)的方法來(lái)完成json.Unmarshal
,但是 JSON 正文并不代表表單。

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
的第三個(gè)參數(shù)http.NewRequest是 http 負(fù)載。
在您的情況下,有效負(fù)載類(lèi)型是application/json. 它需要被視為 json,只有這樣你才能從中獲得一定的價(jià)值。在這種情況下,我們不能使用與從查詢(xún)字符串或表單數(shù)據(jù)中獲取值相同的技術(shù)。
所以只需將jsonStr數(shù)據(jù)解組為映射或結(jié)構(gòu)。
res := make(map[string]interface{})
err := json.Unmarshal(jsonStr, &res)
if err != nil {
panic(err)
}
fmt.Printf("%#v \n", res["title"])
老實(shí)說(shuō),我對(duì)你的問(wèn)題很困惑,為什么你需要從 http 客戶(hù)端請(qǐng)求中獲取有效負(fù)載。
如果你真正想要的是如何從web服務(wù)器端獲取payload,你可以通過(guò)解碼請(qǐng)求體來(lái)獲取。例子:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
payload := make(map[string]interface{})
err := json.NewDecoder(r.Body).Decode(&payload)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
title := payload["title"].(string)
w.Write([]byte(title))
})
卷曲示例(基于您的代碼):
curl -d '{"title":"Buy cheese and bread for breakfast."}' \
-H "Content-Type: application/json" \
-X POST http://localhost:9000
輸出:
Buy cheese and bread for breakfast.

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
因?yàn)槟恼?qǐng)求不是表格。它沒(méi)有任何 GET 參數(shù),也不是表單編碼數(shù)據(jù)。
對(duì)于其他 HTTP 方法,或者當(dāng) Content-Type 不是 application/x-www-form-urlencoded 時(shí),不會(huì)讀取請(qǐng)求 Body,并且 r.PostForm 被初始化為一個(gè)非 nil 的空值。
您可以自由地將請(qǐng)求的主體解析為,但這與表單數(shù)據(jù)?application/json
不同。
- 3 回答
- 0 關(guān)注
- 163 瀏覽
添加回答
舉報(bào)