我有一个CakePHP REST后端设置。在其中,我有一个add函数,检查$this->request->data
,然后保存。
当我使用邮差(Chrome扩展),我设置了所有的数据..
{{domain}}/objects/add
POST
标题:
Accept: application/json
Content-Type: application/json
数据(原始JSON):
{
"Object": {
"field": "value"
}
}
很好。然而,当我尝试用jQuery做到这一点时…我看到请求数据是空的,更确切地说,我期望在[_input:protected]
中的数据为Object%5Bfield%5D=value
为什么它被放在对象的不同部分?
我的相关jquery:
$.ajax({
url: "<?php $base_url ?>/objects/add",
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json"
},
data: { "Object": { "field": "value" } }
})...
除非它已经是一个字符串,否则jQuery将默认将数据转换为查询字符串格式,以适合application/x-www-form-urlencoded
的默认内容类型。
在CakePHP端,您最有可能使用请求处理程序组件,它将根据收到的Content-Type
报头读取原始输入(php://input
, PHP将所有未以application/x-www-form-urlencoded
内容类型发送的数据放入其中),根据类型进行转换,并将其注入请求数据。
https://github.com/cakephp/.../Component/RequestHandlerComponent.php L241-L246
现在,因为jQuery发送application/x-www-form-urlencoded
格式的数据,即Object[field]=value
,但发送application/json
的Content-Type
头,数据最终作为原始输入,请求处理程序将尝试将其解析为JSON,这当然会失败,所以它不会使其进入请求数据。
jQuery方面的简单修复,将JSON数据字符串化,这样数据就会作为一个普通的JSON字符串发送,CakePHP可以正确地解析它:
$.ajax({
//...
data: JSON.stringify({ "Object": { "field": "value" } })
});
参见 http://api.jquery.com/jQuery.ajax/