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))进行分析会给出正确的结果吗?

+2

你用正确的内容类型发送您的要求?它应该是'application/x-www-form-urlencoded' –

+0

@Not_a_Golfer谢谢。解决了这个问题。想知道为什么它没有在这里提到:http://stackoverflow.com/a/23797348/1472186 – paradite

+0

改写为答案然后 –

问题不在于你的服务器代码中,这很好,但只是你的客户端,不管它是什么,都缺少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