请求数据进入_input:protected而不是data

时间:2015-07-30 21:30:26

标签: jquery json rest cakephp

我设置了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" } }
})...

1 个答案:

答案 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" } })
});

另请参阅 http://api.jquery.com/jQuery.ajax/