如果请求的内容类型为application / json,cakephp如何将有效负载与$ this-> request->数据相匹配?

时间:2014-01-19 10:44:56

标签: json angularjs cakephp payload

我注意到我的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上下文中对我的代码进行哪些更改?

1 个答案:

答案 0 :(得分:0)

阅读this告诉我们:

如果您的Content-Type通常是application/x-www-form-urlencoded,那么即使您发送ajax请求,CakePHP也会帮助您将有效负载正确解析为$this->request->data

但是,如果Content-Typeapplication/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