我设置了CakePHP REST后端。在其中,我有一个添加函数,用于检查$this->request->data
然后保存。
当我使用Postman(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" } }
})...
答案 0 :(得分:2)
除非它已经是一个字符串,否则jQuery默认会将数据转换为查询字符串格式以适合application/x-www-form-urlencoded
的默认内容类型。
在CakePHP方面,您最有可能使用请求处理程序组件,该组件将读取原始输入(php://input
,其中PHP将所有未使用application/x-www-form-urlencoded
conten类型发送的数据放入在收到的Content-Type
标题上,根据类型进行转换,并将其注入请求数据。
<强> https://github.com/cakephp/.../Component/RequestHandlerComponent.php#L241-L246 强>
现在,由于jQuery以application/x-www-form-urlencoded
格式发送数据,即Object[field]=value
,但发送Content-Type
application/json
标头,数据最终将作为原始输入,并且请求处理程序将尝试将其解析为JSON,这当然会失败,因此它不会将其转换为请求数据。
简单修复jQuery方面,将你的JSON数据字符串化,这样就可以将数据作为普通的JSON字符串发送,而CakePHP可以正确地解析它:
$.ajax({
//...
data: JSON.stringify({ "Object": { "field": "value" } })
});