如何从此请求获取POST值?

时间:2018-10-30 00:49:05

标签: go post

我有following code

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

我无法提取“标题”参数,也不确定原因。

3 个答案:

答案 0 :(得分:3)

对于http.Request.ParseForm方法,如in the GoDoc所述,主体的类型必须为application/x-www-form-urlencoded,而不是像当前示例那样的JSON:

  

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

以下是使用表单主体的代码的更新示例,它提供了预期的结果:https://play.golang.org/p/Zrw05T2Zb5Z

如果您想从JSON主体中提取值,可以使用json.Unmarshal之类的方法来完成,但是JSON主体并不代表表单。

答案 1 :(得分:2)

http.NewRequest的第三个参数是http有效负载。

在您的情况下,有效载荷类型为application/json。需要将其视为json,只有这样您才能从中获取某些值。在这种情况下,我们不能像从查询字符串或表单数据中获取值那样使用相同的技术。

因此,只需将jsonStr数据解组到map或struct中即可。

res := make(map[string]interface{})
err := json.Unmarshal(jsonStr, &res)
if err != nil {
    panic(err)
}
fmt.Printf("%#v \n", res["title"])

说实话,我对您的问题非常困惑,为什么您需要从http客户端请求中获取有效载荷。

如果您实际上想要的是如何从Web服务器端获取有效负载,则可以通过解码请求正文来获取它。示例:

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.

答案 2 :(得分:1)

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

  

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

[https://golang.org/pkg/net/http/#Request.ParseForm]

您可以随意将请求的正文解析为Object.keys(this.state.location) .map(key => ( <option key={key} value={this.state.location[key]}> {this.state.location[key]} </option> ) ); ,但这与 form 数据不同。