11

我在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');
 });
4

6 回答 6

17

不要将发布数据编码为 json

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

内容类型:“json”

这不是表单 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)——结果$.ajax调用的参数与问题中的语法是正确的。

于 2013-07-18T20:31:01.143 回答
2

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

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

这样做允许我使用 $this->request->data 透明地访问 JSON 发布的数据。另一个答案是不将POST 数据编码为 JSON 的建议变得有点尴尬,因为某些 JS 框架(例如 Angular)默认发布 JSON。

于 2014-08-22T08:32:33.360 回答
2

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

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

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

然后你可以使用:

  $this->MyModel->save($data).
于 2015-06-22T20:47:42.650 回答
1

格式很好的问题:)

我很确定我有答案,尽管我可能是错的......基本上,$this->request它是 Cake 中的一个对象,并且$this->request->data是一个变量/数组,它是该对象的一个​​属性。

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

我认为,如果你放入JSON.stringify({"customer": customer_id})一个'data'数组并发送它,它应该可以工作。

于 2013-07-18T19:50:33.820 回答
0

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

于 2013-07-18T20:32:02.473 回答
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);
    } }
于 2019-11-21T10:01:43.113 回答