使用JSON在CakePHP中设置Content-Type标头

时间:2012-11-16 21:49:14

标签: php http cakephp header

我需要在CakePHP的数据视图中设置Content-Type: application/json; charset=UTF-8。我已经尝试设置$this->response->header('Content-Type', 'application/json; charset=UTF-8');但这并没有改变任何东西。它仍然只输出Content-Type: application/json

6 个答案:

答案 0 :(得分:1)

它在代码中(CakeResponse,第447行):

if (strpos($this->_contentType, 'text/') === 0) {
    $this->header('Content-Type', "{$this->_contentType}; charset={$this->_charset}");
} else {
    $this->header('Content-Type', "{$this->_contentType}");
}

因此只有“text / ...”才会附加charset。 我不知道为什么,但是......

答案 1 :(得分:0)

好笑,我昨晚也有同样的问题。似乎UTF-8是默认的JSON编码,这可能是Cake不发送标头的原因(但无论如何我无法找到对此决定的引用)。

我的解决方案是使用php的json_decode() - 它应该正确解码字符串。我有很多法语口音显示为java / C unicode,例如\u00E9并认为这是一个标题问题。但是在通过json_decode()运行字符串后,重音字符都正确显示。

Marks'链接评论也有很好的信息。

答案 2 :(得分:0)

为此你可以把它放在控制器/功能中:

json_encode($updown_rs);

并在视图文件(views / check_json)中:

var json_object = $.parseJSON(response);   

答案 3 :(得分:0)

application / json没有charset参数。尝试设置一个没有意义。请参阅http://rfc7159.net/rfc7159#ianacons

答案 4 :(得分:0)

我使用的是Cake 2.10.11,只是在json布局中使用了以下代码:

$this->response->charset('utf-8');

答案 5 :(得分:0)

您可以通过在beforefilter方法中使用$this->RequestHandler->ext = 'json';来实现

查看以下示例

public function beforeFilter(){
    parent::beforeFilter();
    $this->RequestHandler->ext = 'json';
}

public function index()
{
    $this->autoRender = false;
    $output = array(
      array('value' =>'first value'),
      array('value' =>'second value'),
    );
    $json = json_encode($output);
    $this->response->body($json);
}