Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

golang parse POST request

Tags:

post

http-post

go

I have a HTTP POST request with payload

indices=0%2C1%2C2

Here is my golang backend code

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

Output:

r.PostForm map[]
r.Form map[]
r.Body indices=0%2C1%2C2
indices from body 0,1,2

Why is it that the POST request is not parsed by r.ParseForm(), while manaully parsing it with url.ParseQuery(string(body)) gives the correct result?

like image 723
paradite Avatar asked Oct 16 '15 07:10

paradite


Video Answer


2 Answers

The problem is not in your server code which is fine, but simply that your client, whatever it is, is missing the correct Content-Type header for POST forms. Simply set the header to

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

In your client.

like image 186
Not_a_Golfer Avatar answered Oct 22 '22 21:10

Not_a_Golfer


Get value form your params use PostFormValue("params") from your http.Request

err := r.ParseForm() 
if err != nil{
       panic(err)
}

params := r.PostFormValue("params") // to get params value with key
like image 39
yaziedda Avatar answered Oct 22 '22 19:10

yaziedda