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数据的字符串表示。不管怎么说,引擎盖下面都有事情发生。(我想……)