POST数据未出现在CakePHP控制器中

时间:2013-07-18 19:42:18

标签: php jquery ajax cakephp

我在knockout.js表单上使用AJAX来发布CakePHP应该收到的一些信息,但是,Cake似乎找不到任何东西。此外,尽管来自POST的状态为200(OK),但警报仍未显示。

这是AJAX

$.ajax({  
          url: "/orders/finalize_payment",  
          type: "POST",  
          dataType: "json",  
          contentType: "json",  
          data: JSON.stringify({"customer": customer_id}),  
          success: function(){              
            alert("success");  
          }
    }); 

这是订单控制器中的相应操作。现在,我把它完全剥离到了最低限度。

function finalize_payment($id = null){
    $this->layout = false;
    $this->autoRender = false;
    if($this->request->is('post')){ //the user has submitted which status to view
        print_r($this->request->data);
            echo "test"; //just to make sure it's reaching this point
    }
}

当我打开chrome中的网络选项卡时,它会将请求有效内容显示为

customer: 1

POST显示为成功,状态为200.我检查了响应标题,它只显示

array
(
)
test

尽管chrome显示有效负载被发送,但CakePHP显然没有找到它。

更新

我将请求从AJAX更改为$ .post并且它有效。我仍然不知道为什么

$.post("/orders/finalize_payment",{"customer_id":customer_id},function(data){
        alert('success');
 });

6 个答案:

答案 0 :(得分:17)

不要将帖子数据编码为json

问题中的代码不会出现在任何PHP脚本中,原因是:

  

contentType:“json”

这不是form-url编码的请求,例如以下代码:

print_r($_POST);
print_r(file_get_contents('php://input'));

将输出:

Array()
'{"customer":123}'

如果您想以json的身份提交数据,则需要阅读原始请求正文:

$data = json_decode(file_get_contents('php://input'));

有时可能会(api使用),但这不是使用$.post的正常方式。

正常方式

提交数据的正常方法是让jQuery为您编写代码:

$.ajax({  
    url: "/orders/finalize_payment",  
    type: "POST",  
    dataType: "json",  // this is optional - indicates the expected response format
    data: {"customer": customer_id},  
    success: function(){              
       alert("success");  
    }
});

这会将帖子数据提交为application/x-www-form-urlencoded,并在控制器中以$this->request->data的形式提供。

为什么$ .post工作

  

我将请求从AJAX更改为$ .post并且它有效。我仍然不知道为什么

隐含在问题中的更新代码:

  • 删除了JSON.stringify调用
  • 从提交json更改为提交application/x-www-form-urlencoded

因此,$.post不起作用且$.ajax没有($.post实际只是调用$.ajax) - 这就是结果{{1}的参数使用问题中的语法调用是正确的。

答案 1 :(得分:2)

使用原始数据和json,您可以使用:

$data = $this->request->input('json_decode');

**数据现在是一个对象,而不是数组。

然后你可以使用:

  $this->MyModel->save($data).

答案 2 :(得分:1)

格式很好的问题:)

我很确定我有答案,虽然我可能错了......基本上,$this->request是Cake中的一个对象,$this->request->data是一个变量/数组,它是一个属性的对象

您发送给Cake的数据直接进入对象(如果可能的话),而不是data数组。这就是Cake使用HtmlHelper生成表单的原因,例如名称为data[User][username]

我认为,如果您将JSON.stringify({"customer": customer_id})放入'data'数组并发送它,它应该有效。

答案 3 :(得分:1)

当您使用CakePHP时,您可能会发现向组件添加RequestHandler可以解决问题。

public $components = array([snip], 'RequestHandler');

这样做让我可以使用$ this-> request->数据透明地访问JSON发布的数据。鉴于某些JS框架(例如Angular)将JSON作为默认值发布,other答案的建议是不将POST数据编码为JSON变得有点尴尬。

答案 4 :(得分:0)

看看this post。您的数据字符串可能不正确。因此CakePHP可能无法将其放入$this->request->data

答案 5 :(得分:0)

使用print_r($ this-> request-> params);

function finalize_payment($id = null){
    $this->layout = false;
    $this->autoRender = false;
    if($this->request->is('post')){ view
        print_r($this->request->params);
    } }