3 回答
TA贡献1890条经验 获得超9个赞
正如该方法的GoDoc 中http.Request.ParseForm
所述,正文的类型必须是 application/x-www-form-urlencoded
,而不是像当前示例那样的 JSON:
对于其他 HTTP 方法,或者当 Content-Type 不是 application/x-www-form-urlencoded 时,不会读取请求 Body,并且 r.PostForm 被初始化为一个非 nil 的空值。
如果您想从 JSON 正文中提取值,可以使用诸如 之类的方法来完成json.Unmarshal
,但是 JSON 正文并不代表表单。
TA贡献1891条经验 获得超3个赞
的第三个参数http.NewRequest是 http 负载。
在您的情况下,有效负载类型是application/json. 它需要被视为 json,只有这样你才能从中获得一定的价值。在这种情况下,我们不能使用与从查询字符串或表单数据中获取值相同的技术。
所以只需将jsonStr数据解组为映射或结构。
res := make(map[string]interface{})
err := json.Unmarshal(jsonStr, &res)
if err != nil {
panic(err)
}
fmt.Printf("%#v \n", res["title"])
老实说,我对你的问题很困惑,为什么你需要从 http 客户端请求中获取有效负载。
如果你真正想要的是如何从web服务器端获取payload,你可以通过解码请求体来获取。例子:
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贡献1828条经验 获得超4个赞
因为您的请求不是表格。它没有任何 GET 参数,也不是表单编码数据。
对于其他 HTTP 方法,或者当 Content-Type 不是 application/x-www-form-urlencoded 时,不会读取请求 Body,并且 r.PostForm 被初始化为一个非 nil 的空值。
您可以自由地将请求的主体解析为,但这与表单数据 application/json
不同。
- 3 回答
- 0 关注
- 107 浏览
添加回答
举报