2012-06-19 34 views
36

我想用Zepto或Jquery中的$ .ajax發佈一個對象數組。兩人都表現出同樣的奇怪的錯誤,但我找不到我做錯了什麼。

當使用諸如'RestEasy'之類的測試客戶端發送數據時,數據會保存到服務器中,並且我可以看到請求在瀏覽器的網絡面板中變得不穩定,所以我相信JS是罪魁禍首。

如果我發送一個對象數組作爲POST的數據屬性,它們不會正確發送。

數據對象:

var postData = [ 
    { "id":"1", "name":"bob"} 
    , { "id":"2", "name":"jonas"} 
    ] 

請求:所看到在瀏覽器

$.ajax({ 
    url: _saveDeviceUrl 
, type: 'POST' 
, contentType: 'application/json' 
, dataType: 'json' 
, data: postData 
, success: _madeSave.bind(this) 
//, processData: false //Doesn't help 
}); 

請求正文:

"bob=undefined&jonas=undefined" 

這可以通過使用$ .PARAM更直接看到jQuery和Zepto用來準備POST數據的方法。

$.param(
    [ 
    { "id":"1", "name":"bob"} 
    , { "id":"2", "name":"jonas"} 
    ] 
) 
// Output: "bob=undefined&jonas=undefined" 

因此,這些庫對複雜的後期數據所做的準備似乎與我預期的不同。

我看到這個答案,但我不想發送數據作爲查詢參數,因爲我在發佈大量內容。 How do I send an array in an .ajax post using jQuery?

使用jQuery/Zepto通過POST發送多個對象的正確方法是什麼?使用$ .ajax({... data:JSON.stringify(postData)...})發送非損壞內容,但服務器不喜歡該格式。

更新: 好像JSON.stringify發送正確格式的內容。問題在於服務器端非常非常關注它想要的對象結構。如果我添加或刪除對象中的任何屬性,它將會使整個過程失敗,而不是使用匹配的屬性。這很不方便,因爲使用服務器發送的內容作爲視圖模型很好,但視圖模型會發生變化。 ...仍在努力尋找最佳解決方案。

+0

您是否使用PHP接收這些數據?如果是的話,你可以嘗試使用[.serialize()](http://api.jquery.com/serialize/),但是你需要在變量名的末尾添加'[]'並且將它們作爲數組 –

回答

70

發送前一定要stringify。我過度依賴圖書館,並認爲他們會根據我發佈的內容類型進行正確編碼,但他們似乎沒有。

作品:

$.ajax({ 
    url: _saveAllDevicesUrl 
, type: 'POST' 
, contentType: 'application/json' 
, data: JSON.stringify(postData) //stringify is important 
, success: _madeSave.bind(this) 
}); 

我喜歡這種方法使用像$ .toJSON一個插件,雖然確實做到同樣的事情。

+0

嘿,快點。我通過一些'+ ='語句構建了一個URL格式的字符串參數列表,例如'x = 123&y = 1234&z = 12345' ......現在說實話......很長很長。我也知道URL,所以理論上我只需要執行'data:myParamString',還是需要JSON.stringify呢?謝謝,我知道這是一個老問題 – shanehoban

+1

@shanehoban在POST中,參數通常在正文中發送,而不是URL參數。你在做GET嗎?無論如何,我不認爲這是非常相關的。可能想要開一個不同的問題。 – SimplGy

+0

謝謝,我現在明白了 - 這是前一陣子:) @Simple雖然很讚賞! – shanehoban

4

編輯:我想這是現​​在開始可以安全地使用本地JSON.stringify()方法,通過most browsers支持(是的,即使IE8 +如果你想知道)。

簡單:

JSON.stringify(yourData) 

你應該編碼您的數據在JSON發送之前,你不能只是將對象這樣的POST數據。

我推薦使用jQuery json plugin來這樣做。然後,您可以使用這樣的jQuery中:

$.post(_saveDeviceUrl, { 
    data : $.toJSON(postData) 
}, function(response){ 
    //Process your response here 
} 
); 
+1

它已經是一個JavaScript對象,我認爲轉換很簡單,或者由這些庫自動處理。 js對象和JSON傳輸對象之間實際進行了哪些轉換?這與JSON.stringify相同嗎? – SimplGy

11

嘗試以下操作:

$.ajax({ 
    url: _saveDeviceUrl 
, type: 'POST' 
, contentType: 'application/json' 
, dataType: 'json' 
, data: {'myArray': postData} 
, success: _madeSave.bind(this) 
//, processData: false //Doesn't help 
}); 
+0

這是一個更好的方法,因爲JavaScript中的數組本身不是JSON。即使{[]}無效。該數組需要被一個Object包裝並且包含在一個屬性中。 –

+1

謝謝,最好的解決方案是你的。 它幫助我發送一個包含ajax的對象數組到我的web ASP.net api。 –

相關問題