如何在CakePHP中为JSON返回正确的内容类型?

时间:2009-08-04 08:37:22

标签: php ajax json cakephp content-type

我正在尝试为使用AJAX GET请求访问的JSON响应设置content-type标头。我已经关注了博客和面包店的教程,但我总是从CakePHP收到'text / html'。如何正确设置内容类型标题?

这是我目前的代码:

public function admin_controller_actions_ajax()
{
    Configure::write('debug', 0);
    if ($this->RequestHandler->isGet()) {
        $this->autoRender = FALSE;

        $aco_id = $this->params['url']['aco_id'];
        $aro_id = $this->params['url']['aro_id'];

        assert('$aco_id != NULL && $aro_id != NULL &&
                is_numeric($aco_id) && is_numeric($aro_id)');

        $actions = $this->Resource->getActionsForController($aco_id, $aro_id);

        assert('is_array($actions) && is_array($actions[0])');

        /* I made RequestHandler part of the $components property */
        $this->RequestHandler->setContent('json');
        $this->RequestHandler->respondAs('json'); /* I've tried 'json', 'JSON', 'application/json' but none of them work */

        $this->set('json_content', json_encode(array('response' => $actions[0])));
        $this->layout = NULL;
        $this->render('/json/default');
    }
}


/* json/default.ctp */
<?php echo $json_content; ?>

任何帮助都将不胜感激。

谢谢,

- 艾萨克

5 个答案:

答案 0 :(得分:7)

我进行Ajax调用以检索所有项目中的JSON内容,而且我从未完成过你在这里所做的大部分工作。我的控制器代码的范围看起来像这样:

public function do_something_ajaxy() {
  Configure::write ( 'debug', 0 );
  $this->autoRender = false;

  /** Business logic as required */

  echo json_encode ( $whatever_should_be_encoded );
}

我通过jQuery进行Ajax调用,所以我认为可以有所作为,但这会让我感到惊讶。在这种情况下,您的问题似乎出现在处理程序中,而不是调用者。我建议删除第17-23行,并用简单的echo json_encode ( array('response' => $actions[0]) )语句替换它们。

您还在测试$this->RequestHandler->isGet()。请尝试测试$this->RequestHandler->isAjax()。我不确定Ajax调用是否被它们的类型和方法识别出来。

答案 1 :(得分:7)

在阅读thisthis后,我得到以下内容以返回“ Content-Type:application / json ”:

Configure::write('debug', 0);
$this->RequestHandler->respondAs('json');
$this->autoRender = false;            
echo json_encode($data);

使用JQuery的$ .getJSON方法,我仍然得到

Resource interpreted as image but transferred with MIME type text/html.

但至少我的数据正在解析。

答案 2 :(得分:2)

我也遇到了这个问题,并使用以下方法解决了这个问题:

$this->RequestHandler->respondAs('text/x-json');

还要确保配置文件中的“debug”设置为小于2,否则将不会设置标头。

答案 3 :(得分:1)

肯定(并且,老实说,我从未使用过CakePHP),但您可能想尝试在setContent方法中指定第二个参数。

替换这个:

$this->RequestHandler->setContent('json') 

用这个:

$this->RequestHandler->setContent('json', 'text/x-json');

请参阅this file以获取示例..

答案 4 :(得分:0)

我一直遇到和原版海报一样的问题,对我有用的是遵循Rob Wilkerson的建议,但也要确保我正在使用

jQuery.ajax()

而不是

jQuery.get()

jQuery.post()

jQuery.ajax()允许您将dataType设置为'json',而其他两个似乎根本不允许您设置数据类型。当我将AJAX请求中的数据类型设置为'json'时,它都可以正常工作。