Golang 解析 POST 请求

13

我有一个带载荷的HTTP POST请求

indices=0%2C1%2C2

这是我的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

为什么使用r.ParseForm()无法解析POST请求,而手动使用url.ParseQuery(string(body))却能正确解析呢?


3
你是否使用了正确的内容类型发送请求?它应该是 application/x-www-form-urlencoded - Not_a_Golfer
@Not_a_Golfer 谢谢。问题已解决。不知道为什么这里没有提到:https://dev59.com/e2Qo5IYBdhLWcg3wZepg#23797348 - paradite
rephrasing as an answer then - Not_a_Golfer
2个回答

18

问题并不在你的服务器代码上,它很好。而是你的客户端缺少正确的Content-Type标头用于提交表单。只需将标头设置为

Content-Type: application/x-www-form-urlencoded

在您的客户端中。


当你处理 XML / JSON 时也是一样的。如果你的请求发送的是 json,总是要设置头部为“Content-Type: application/json”。XML 也是一样。根据内容配置请求是一个非常好的实践(有时是强制性的),以避免后端需要“猜测”正在处理什么。 - Federico Leon

8
使用PostFormValue("params")从您的http.Request中获取参数值。
err := r.ParseForm() 
if err != nil{
       panic(err)
}

params := r.PostFormValue("params") // to get params value with key

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接