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"))
}
我无法提取“标题”参数,也不确定原因。
答案 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 数据不同。