我在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');
});
答案 0 :(得分:17)
问题中的代码不会出现在任何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
的形式提供。
我将请求从AJAX更改为$ .post并且它有效。我仍然不知道为什么
隐含在问题中的更新代码:
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);
} }