如何用$ .ajax(jQuery或Zepto)POST一个对象数组

Sim*_*lGy 44 ajax rest jquery zepto

我想在Zepto或Jquery中用$ .ajax POST一个对象数组.两者都表现出相同的奇怪错误,但我找不到我做错了什么.

当使用像'RestEasy'这样的测试客户端发送数据时,数据会保存到服务器,我可以在浏览器的网络面板中看到请求被破坏,所以我相信JS是罪魁祸首.

如果我发送一个对象数组作为POST的数据属性,则它们没有正确发送.

数据对象:

var postData = [
    { "id":"1", "name":"bob"}
  , { "id":"2", "name":"jonas"}
  ]
Run Code Online (Sandbox Code Playgroud)

请求:

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

请求正文,如浏览器中所示:

"bob=undefined&jonas=undefined"
Run Code Online (Sandbox Code Playgroud)

通过使用jQuery和Zepto用于准备POST数据的$ .param方法,可以更直接地看到这一点.

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

因此,这些库为复杂的后期数据做的准备似乎与我预期的不同.

我看到了这个答案,但我不希望将数据作为查询参数发送,因为我正在发布大量内容. 如何使用jQuery在.ajax帖子中发送数组?

使用jQuery/Zepto通过POST发送多个对象的正确方法是什么?

使用$ .ajax({... data:JSON.stringify(postData)...})发送非破坏内容,但服务器不喜欢该格式.

更新: 似乎JSON.stringify发送格式正确的内容.问题是服务器端非常非常具体地说明了它想要的对象的结构.如果我在对象中添加或删除任何属性,它将使整个过程失败,而不是使用匹配的属性.这很不方便,因为将服务器发送的内容用作视图模型很好,但视图模型会发生变化.......仍在努力寻求最佳解决方案.

Sim*_*lGy 78

务必stringify在发送之前.我过于依赖图书馆并认为他们会根据我发布的内容类型进行正确编码,但他们似乎并没有.

作品:

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

我更喜欢这种方法来使用像$ .toJSON这样的插件,虽然这确实完成了同样的事情.

  • 怎么样告诉我们postData中的数据是什么,所以我们知道这个答案实际解决了什么.而且重要的是,您尝试使用哪些数据无法使用.目前所有这些答案都不完整. (3认同)
  • @shanehoban在POST中,参数通常在正文中发送,而不是作为URL参数.你在做GET吗?无论如何,我认为这不是很相关.可能想要打开一个不同的问题. (2认同)

Ric*_*ann 15

请尝试以下方法:

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


Sim*_*mon 5

编辑:我想现在可以使用大多数浏览器支持的本地JSON.stringify()方法了(是的,如果您想知道的话甚至是IE8 +)也已经很安全了。

简单如:

JSON.stringify(yourData)
Run Code Online (Sandbox Code Playgroud)

在发送数据之前,您应该使用JSON对数据进行编码,您不能仅将这样的对象作为POST数据发送。

我建议使用jQuery json插件来这样做。然后,您可以在jQuery中使用如下所示的内容:

$.post(_saveDeviceUrl, {
    data : $.toJSON(postData)
}, function(response){
    //Process your response here
}
);
Run Code Online (Sandbox Code Playgroud)