猿问

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

我有以下代码


package main


import (

    "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"))

}

我无法提取“标题”参数,也不知道为什么。


哈士奇WWW
浏览 108回答 3
3回答

当年话下

正如该方法的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 正文并不代表表单。

万千封印

的第三个参数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.

明月笑刀无情

因为您的请求不是表格。它没有任何 GET 参数,也不是表单编码数据。对于其他 HTTP 方法,或者当 Content-Type 不是 application/x-www-form-urlencoded 时,不会读取请求 Body,并且 r.PostForm 被初始化为一个非 nil 的空值。您可以自由地将请求的主体解析为,但这与表单数据 application/json不同。
随时随地看视频慕课网APP

相关分类

Go
我要回答