golang解析POST请求
问题描述:
我有一个有效载荷golang解析POST请求
indices=0%2C1%2C2
这里一个HTTP POST请求我golang后端代码
err := r.ParseForm()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println("r.PostForm", r.PostForm)
log.Println("r.Form", r.Form)
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println("r.Body", string(body))
values, err := url.ParseQuery(string(body))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println("indices from body", values.Get("indices"))
输出:
r.PostForm map[]
r.Form map[]
r.Body indices=0%2C1%2C2
indices from body 0,1,2
为什么是它的POST请求不会被r.ParseForm()
解析,而用url.ParseQuery(string(body))
进行分析会给出正确的结果吗?
答
问题不在于你的服务器代码中,这很好,但只是你的客户端,不管它是什么,都缺少POST表单的正确Content-Type
头。只需将标头设置为
Content-Type: application/x-www-form-urlencoded
在您的客户端。
+0
同样的事情,当你使用XML/JSON。如果您的请求发送json,则始终设置头文件“Content-Type:application/json''。 XML相同。它是一种很好的做法(有时是强制性的),根据其内容来配置请求,以避免后台“猜测”处理的需求。 –
答
获得价值形成的PARAMS使用PostFormValue( “PARAMS”)从http.Request
err := r.ParseForm()
if err != nil{
panic(err)
}
params := r.PostFormValue("params") // to get params value with key
你用正确的内容类型发送您的要求?它应该是'application/x-www-form-urlencoded' –
@Not_a_Golfer谢谢。解决了这个问题。想知道为什么它没有在这里提到:http://stackoverflow.com/a/23797348/1472186 – paradite
改写为答案然后 –