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



我有一个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/jsonContent-Type头,数据最终作为原始输入,请求处理程序将尝试将其解析为JSON,这当然会失败,所以它不会使其进入请求数据。

jQuery方面的简单修复,将JSON数据字符串化,这样数据就会作为一个普通的JSON字符串发送,CakePHP可以正确地解析它:

$.ajax({
    //...
    data: JSON.stringify({ "Object": { "field": "value" } })
});

参见 http://api.jquery.com/jQuery.ajax/

最新更新