11

如果我尝试使用$.ajaxPOST 数据字典,例如:

{
    list: ["fake_id_0"],
    mapType: "fakeToRealId"
}

jQuery 做了一些奇怪的事情;它将数据转换为:

{
    list[]: ["fake_id_0"],
    mapType: "fakeToRealId"
}

如您所见,它为键添加了括号list,但没有为mapType键添加括号。现在在一般的 REST 意义上,是的,人们用括号来命名带有数组值的键是很常见的……但我的服务器不能这样工作,所以如果我尝试 POSTlist[]我会遇到问题。

$.ajax在这段代码中,我已将此问题追溯到 parseData 选项的处理:

// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
    s.data = jQuery.param( s.data, s.traditional );
}

如果我使用processData: false它确实会跳过该块......但它也不会为我的数据进行 URLEncode。

所以,我的问题是:如何在没有 jQuery 修改我的键名的情况下拨$.ajax打电话?processData: true或者失败了,我该如何使用,但除了括号添加之外processData: false,仍然可以从该选项中获得所有效果?

PS 或者,如果这都是非标准的 jQuery 行为,是由我拥有的某些插件引起的,请让我知道 :-)

* 编辑 *

我回答了我自己的问题,然后删除了那个答案,因为我意识到它有缺陷。我回答说设置选项traditional:true(在$.ajax调用中)修复了括号,它确实......但它也有一个副作用,即它不会序列化嵌套对象。

所以我修改后的问题是:如何在不让 jQuery 修改我的键名并且不禁用嵌套属性的序列化的情况下进行$.ajax调用?processData: true换句话说,我如何让 jQuery 像现在一样做所有事情……除了不给我的键添加括号?

4

2 回答 2

4

当您意识到这不是错误时。我相信在 1.4 版之后,括号专门用于解决多级对象的问题。您可以查看 .param() 本身以了解原因。http://api.jquery.com/jQuery.param/

我相信你想要的东西是不可能的,验证的好方法是尝试手动结束对一个字符串进行编码。我相信如果没有括号,您将无法以唯一可解码的方式对其进行编码。

要修改我的答案,请引用上面的链接

注意:由于某些框架解析序列化数组的能力有限,因此在传递包含嵌套在另一个数组中的对象或数组的 obj 参数时,开发人员应谨慎行事。

注意:因为没有普遍认可的参数字符串规范,所以不可能使用这种方法以在支持这种输入的所有语言中理想地工作的方式对复杂的数据结构进行编码。改用 JSON 格式作为编码复杂数据的替代方案。

因此,如果您的服务器已准备好解析 json,那么您可以像这样发送您的请求。

$.ajax({
    url: 'something',
    type: 'GET',
    data: JSON.stringify(data),
    contentType: 'application/json; charset=utf-8',
});
于 2013-06-06T00:07:51.407 回答
1

我知道问题主体已经暗示了这一点,但这是避免 jQuery 的这一奇妙特性的方法。如果你有:

$.get(api_url, {my_param: my_arguments})

将其更改为:

$.get(api_url, $.param({my_param: my_arguments}, true))
于 2016-05-23T13:10:57.380 回答