我有以下代码:
$.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
函数吗?
答案 0 :(得分:1)
要使用jquery 发送 json数据,必须先将对象字符串化,然后再将其传递给jQuery; jQuery不会为你做这件事。
在幕后,如果processData参数为true(默认情况下)并且data参数不包含字符串,则data参数的值将传递给$.param()
,从而创建一个参数串。因此,如果将对象传递给数据参数,则请求正文将包含a=1&b=2
。如果你只是将processData设置为false,jquery将跳过$.param
进程并直接将对象的.toString值发送到请求体[object Object]
,这样就不会工作要么。如果将对象字符串化为JSON,它将是一个字符串,jQuery将把它传递给请求体。