如果我尝试使用$.ajaxPOST一个数据字典,如:
{
list: ["fake_id_0"],
mapType: "fakeToRealId"
}
Run Code Online (Sandbox Code Playgroud)
jQuery做了一些奇怪的事情; 它将数据转换为:
{
list[]: ["fake_id_0"],
mapType: "fakeToRealId"
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它为list键添加括号,但不是mapType键.现在在一般的REST意义上,是的,人们通常使用括号来命名具有数组值的键...但是我的服务器不能以这种方式工作,所以如果我尝试POST list[]我有问题.
我已经跟踪了这个问题,直到$.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 );
}
Run Code Online (Sandbox Code Playgroud)
如果我使用processData: false它确实跳过那个块......但是它也没有为我提供URLEncode我的数据.
所以,我的问题是:如何在没有jQuery的情况下进行$.ajax调用,processData: true修改我的密钥名称?或者失败了,我如何使用processData: false,但除了括号添加之外,仍然可以从该选项中获得所有效果?
PS或者,如果这是所有非标准的jQuery行为,由我所拥有的一些插件引起,请告诉我相反:-)
*编辑*
我回答了自己的问题,然后删除了答案,因为我意识到它有缺陷.我回答说设置选项traditional:true(在$.ajax调用中)修复括号,它确实...但它也有副作用,即它不会序列化嵌套对象.
所以我修改过的问题是:如何在不使用jQuery的情况下$.ajax调用processData: true我的键名来修改我的键名并且不禁用其嵌套属性的序列化?换句话说,我如何让jQuery做与目前相同的一切...除了不在我的键上添加括号?
正如您意识到这不是一个错误。我相信在 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',
});
Run Code Online (Sandbox Code Playgroud)