Как вернуть правильный тип контента для JSON в CakePHP?

Я пытаюсь установить заголовок типа контента для ответа 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», все это работало так, как должно.