我注意到我的angularjs
需要将标头设置为以下内容,以便它与CakePHP
很好地配合使用。
angularApp.config(function ($httpProvider) {
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
$httpProvider.defaults.headers.common['Accept'] = 'application/json';
$httpProvider.defaults.transformRequest = function(data) {
if (data === undefined) {
return data;
}
return $.param(data);
}
});
我的CakePHP
为2.4,并使用JsonView
呈现ajax请求。
我的问题是,angularjs
的{{1}}默认标头是Content-Type
,如果我将其用作默认设置并application/json;charset=utf-8
我的数据,
可以JSON.stringify
使用吗?
如果没有,我需要在CakePHP
上下文中对我的代码进行哪些更改?
答案 0 :(得分:0)
阅读this告诉我们:
如果您的Content-Type
通常是application/x-www-form-urlencoded
,那么即使您发送ajax
请求,CakePHP
也会帮助您将有效负载正确解析为$this->request->data
但是,如果Content-Type
为application/json
,那么您需要使用$this->request->input('json_decode')
基本上,我们假设你的angularjs配置是:
angularApp.config(function ($httpProvider) {
// because you did not explicitly state the Content-Type for POST, the default is application/json
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
$httpProvider.defaults.headers.common['Accept'] = 'application/json';
$httpProvider.defaults.transformRequest = function(data) {
if (data === undefined) {
return data;
}
//return $.param(data);
return JSON.stringify(data);
}
});
那里有不完整的信息。
假设您仍在接收数据并将其作为数组进行操作,则需要实际使用$this->request->input('json_decode', true)
。
为了解决问题,请将其保存为AppController上的受保护方法或适当的控制器。
protected function _decipher_data() {
$contentType = $this->request->header('Content-Type');
$sendsJson = (strpos($contentType, 'json') !== false);
$sendsUrlEncodedForm = (strpos($contentType, 'x-www-form-urlencoded') !== false);
if ($sendsJson) {
$this->request->useful_data = $this->request->input('json_decode', true);
}
if ($sendsUrlEncodedForm) {
$this->request->useful_data = $this->request->data;
}
return $this->request->useful_data;
}
然后在适当的操作中,您可以
$data = $this->_decipher_data();
$data['User']['id'] = $id;
OR
在你的beforeFilter里面执行此操作:
$this->_decipher_data();
然后在适当的操作中,你这样做:
$this->request->useful_data['User']['id'] = $id