我正在尝试为使用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; ?>
任何帮助都将不胜感激。
谢谢,
- 艾萨克
答案 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)
在阅读this和this后,我得到以下内容以返回“ 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'时,它都可以正常工作。