jQuery ajax方法不接受PlainObject作为数据

时间:2017-03-13 19:59:26

标签: 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_all是字典(例如{"a":1, "b":2})。运行此代码当前返回400错误(使用django,如果相关)。如果我做了一个改变:

  ...
  data: JSON.stringify(data_all),
  ...

一切正常。

事情是,情况不应该如此。 jQuery AJAX文档明确指出data参数接受字符串,数组和PlainObjects。在调试器模式下(使用Chrome开发工具),我已经验证data_all是一个PlainObject:

jQuery.isPlainObject(data_all)  # returns "true"

我使用jQuery 2.1.4,所以这应该在那里。知道为什么这需要stringify函数吗?

1 个答案:

答案 0 :(得分:1)

要使用jquery 发送 json数据,必须先将对象字符串化,然后再将其传递给jQuery; jQuery不会为你做这件事。

在幕后,如果processData参数为true(默认情况下)并且data参数不包含字符串,则data参数的值将传递给$.param(),从而创建一个参数串。因此,如果将对象传递给数据参数,则请求正文将包含a=1&b=2。如果你只是将processData设置为false,jquery将跳过$.param进程并直接将对象的.toString值发送到请求体[object Object],这样就不会工作要么。如果将对象字符串化为JSON,它将是一个字符串,jQuery将把它传递给请求体。