Javascript jQuery ajax方法不接受PlainObject作为数据
我有以下代码:Javascript jQuery ajax方法不接受PlainObject作为数据,javascript,jquery,ajax,http-status-code-400,Javascript,Jquery,Ajax,Http Status Code 400,我有以下代码: $.ajax({ method: "POST", url: "/handler", contentType: "application/json", data: data_all, }) .done(function(r) { ...stuff... }) .fail(function(r) { ...stuff... }); data\u all是一个字典(例如,{“a”:1,“b”:2})。运行此代码当前返回一个400错误(在相关情况下使
$.ajax({
method: "POST",
url: "/handler",
contentType: "application/json",
data: data_all,
})
.done(function(r) { ...stuff... })
.fail(function(r) { ...stuff... });
data\u all
是一个字典(例如,{“a”:1,“b”:2}
)。运行此代码当前返回一个400错误(在相关情况下使用django)。如果我做一个改变:
...
data: JSON.stringify(data_all),
...
一切正常
问题是,情况不应该是这样。jqueryajax文档清楚地说明数据
参数接受字符串、数组和纯对象。在调试器模式下(使用Chrome开发工具),我已经验证了data\u all
是一个纯对象:
jQuery.isPlainObject(data_all) # returns "true"
我使用的是jQuery2.1.4,所以这里应该有。知道为什么这需要使用字符串化函数吗?要使用jquery发送json数据,必须先字符串化对象,然后再将其传递给jquery;jQuery不会为您做这件事
在引擎盖下,如果processData参数为true(默认情况下为true),并且数据参数不包含字符串,则数据参数的值将传递给$.param()
,这将创建一个参数字符串。因此,如果将对象传递给数据参数,则请求正文将包含a=1&b=2
。如果只是将processData设置为false,jquery将跳过$.param
过程,直接将对象的.toString值发送到请求主体,即[object object]
,因此这也不会起作用。如果将对象字符串化为JSON,它将是一个字符串,jQuery将不加更改地将其传递给请求主体。@Mikey-谢谢,fixedRight,您可以给它一个对象。但jQuery不会自动转换所述对象以匹配给定的内容类型。对象不是json,jquery将该对象转换为参数字符串,从而为您的内容类型提供无效数据。这些都在文档中。查看浏览器开发人员工具中的“网络”选项卡,查看在每种情况下传递给服务的内容。您还可以尝试在ajax选项对象中设置processData:false
。processData:false在仍然使用对象时不会产生预期的结果。(我希望它会产生包含[object object]
)的body@KevinB-但是stringify也不会输出json对象,它是json数据的字符串表示。不管怎么说,引擎盖下面都有事情发生。(我想……)