2015-10-16 156 views
4

我有一個有效載荷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

改寫爲答案然後 –

回答

12

問題不在於你的服務器代碼中,這很好,但只是你的客戶端,不管它是什麼,都缺少POST表單的正確Content-Type頭。只需將標頭設置爲

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

在您的客戶端。

+0

同樣的事情,當你使用XML/JSON。如果您的請求發送json,則始終設置頭文件「Content-Type:application/json''。 XML相同。它是一種很好的做法(有時是強制性的),根據其內容來配置請求,以避免後臺「猜測」處理的需求。 –

2

獲得價值形成的PARAMS使用PostFormValue( 「PARAMS」)從http.Request

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

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