Я пытаюсь установить заголовок типа контента для ответа JSON, к которому обращается запрос AJAX GET. Я следил за учебниками по блогам и пекарне, но я всегда получаю «text / html» обратно от CakePHP. Как правильно настроить заголовок содержимого?
Вот мой код на данный момент:
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; ?>
Любая помощь будет оценена по достоинству.
Благодаря,
– Исаак
Я делаю призывы 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 ); }
Я делаю свои Ajax-вызовы через jQuery, поэтому, полагаю, это может изменить ситуацию, но это меня удивит. В этом случае проблема связана с обработчиком, а не с вызывающим. Я бы рекомендовал удалить строки 17-23 и заменить их простой echo json_encode ( array('response' => $actions[0]) )
.
Вы также тестируете $this->RequestHandler->isGet()
. Попробуйте вместо этого $this->RequestHandler->isAjax()
. Я не уверен, что Ajax-вызовы распознаются как их типом, так и их методом.
Прочитав это и это , я получил следующее, чтобы вернуть « Content-Type: application / json »:
Configure::write('debug', 0); $this->RequestHandler->respondAs('json'); $this->autoRender = false; echo json_encode($data);
С помощью метода $ .getJSON JQuery я все еще получаю
Resource interpreted as image but transferred with MIME type text/html.
Но по крайней мере мои данные анализируются.
У меня также была эта проблема, и я решил ее:
$this->RequestHandler->respondAs('text/x-json');
Также убедитесь, что «debug» в вашем файле конфигурации установлен менее чем 2, иначе заголовок не будет установлен.
Я не уверен (и, честно говоря, я никогда не использовал CakePHP), но вы можете попытаться указать второй аргумент метода setContent.
замените это:
$this->RequestHandler->setContent('json')
с этим:
$this->RequestHandler->setContent('json', 'text/x-json');
см. этот файл для примера ..
У меня была та же проблема, что и исходный плакат, и то, что сработало для меня, заключалось в том, чтобы следовать совету Роба Вилкерсона, но также убедитесь, что я использую
jQuery.ajax()
вместо
jQuery.get()
или
jQuery.post()
jQuery.ajax () позволяет установить для dataType значение «json», тогда как другие два, похоже, не позволяют вам устанавливать тип данных вообще. Когда я задал тип данных в запросе AJAX «json», все это работало так, как должно.