为了账号安全,请及时绑定邮箱和手机立即绑定

如何从此请求中获取 POST 值?

如何从此请求中获取 POST 值?

Go
哈士奇WWW 2023-05-04 17:00:45
我有以下代码:package mainimport (    "bytes"    "fmt"    "net/http")func main() {    var jsonStr = []byte(`{"title":"Buy cheese and bread for breakfast."}`)    req, err := http.NewRequest("POST", "/", bytes.NewBuffer(jsonStr))    if err != nil {        panic(err)    }    req.Header.Set("X-Custom-Header", "myvalue")    req.Header.Set("Content-Type", "application/json")    req.ParseForm()    fmt.Printf("%v:%v", "title", req.Form.Get("title"))}我无法提取“标题”参数,也不知道为什么。
查看完整描述

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 正文并不代表表单。


查看完整回答
反对 回复 2023-05-04
?
万千封印

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.


查看完整回答
反对 回复 2023-05-04
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

因为您的请求不是表格。它没有任何 GET 参数,也不是表单编码数据。

对于其他 HTTP 方法,或者当 Content-Type 不是 application/x-www-form-urlencoded 时,不会读取请求 Body,并且 r.PostForm 被初始化为一个非 nil 的空值。

您可以自由地将请求的主体解析为,但这与表单数据 application/json不同。


查看完整回答
反对 回复 2023-05-04
  • 3 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信