2014-12-27 65 views
2

我想發送JSON參數到我的服務器並使用json.Decoder解析它們。我讀過你應該能夠從request.Body屬性中獲取查詢參數。以下是我的服務器代碼:Golang淨/ http請求身體總是空

func stepHandler(res http.ResponseWriter, req *http.Request) { 
    var v interface{} 
    err := json.NewDecoder(req.Body).Decode(&v) 
    if err != nil { 
     // handle error 
    } 
    log.Println(v) 
} 

每到這時,我看到2014/12/26 22:49:23 <nil>(DIFF時間戳,當然)。我的客戶端AJAX調用如下:

$.ajax({ 
    url: "/step", 
    method: "get", 
    data: { 
    steps: $("#step-size").val(), 
    direction: $("#step-forward").prop("checked") ? 1 : -1, 
    cells: JSON.stringify(painted) 
    }, 
    success: function (data) { 
    painted = data; 
    redraw(); 
    }, 
    error: function (xhr) { 
    console.log(xhr); 
    } 
}); 

被髮送的代碼示例網址:

http://localhost:5000/?steps=1&direction=1&cells=%5B%7B%22row%22%3A11%2C%22column%22%3A15%7D%2C%7B%22row%22%3A12%2C%22column%22%3A15%7D%5D 

在PARAMS一個更好看:

{ 
    steps: "1", 
    direction: "1", 
    cells: "[{"row":11,"column":15},{"row":12,"column":15}]" 
} 

我有試過GET和POST請求。

爲什麼我的req.Body從不解碼?如果我嘗試單獨打印req.Body,我也會看到零。

+0

在我看來'req.Body'確實是空的 - 那麼爲什麼不調用'req.ParseForm()',然後使用'req.Form'呢?是什麼讓你覺得'Body'會以某種方式得到在請求的主體中肯定不是**的東西(查詢參數)? –

+0

我似乎有什麼req.Body引用的誤解。 req.Form給了我一張地圖 - 有什麼方法可以自動將查詢字符串解組到一個對象中嗎? –

+0

@AlexMartelli,我用你的解決方案去了。如果您創建答案,我可以將其標記爲解決此問題的答案。非常感謝! –

回答

4

req.Body確實是空的 - 所以,我會做的事情叫req.ParseForm(),然後用req.Form來代替。 Body不會獲取絕對不在請求正文中的內容(如查詢參數)。

0

請求的Body沿有效負載內發送 - 它不是URL的一部分。

您正試圖訪問該機構..當您的數據真正在URL中。

您希望它將您的ajax 更改爲method: "post" - 以便將數據與正文一起發佈,而不是URL的一部分。您還應該確保數據確實是通過您選擇的開發工具瀏覽器與請求一起發送的。或者,如果您確實希望將數據作爲URL的一部分發送,則應該訪問請求的URL參數 - 並手動將這些值解析爲一個結構體(json軟件包不會爲您做IIRC)。

+0

Json不會這樣做,但'req.ParseForm()'(然後訪問'req.Form')應該代表你進行解析,不是嗎? –

+0

是的 - 我的觀點是將它映射到結構將是一個手動過程 - 與json包的'Decode'方法相反。 –

+0

我嘗試將我的方法更改爲POST,並且驗證數據是作爲有效內容在本體中發送的,但每次嘗試解碼時我仍然得到零。但是,現在我的Body看起來像是&&0xc208020620 false {0 0} false}'。 –