Как вернуть правильный тип контента для JSON в CakePHP? - PullRequest
10 голосов
/ 04 августа 2009

Я пытаюсь установить заголовок типа содержимого для ответа 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; ?>

Любая помощь будет оценена.

Спасибо

- Isaac

Ответы [ 5 ]

7 голосов
/ 30 ноября 2010

После прочтения этого и этого я получил следующее возвращаемое " 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.

Но по крайней мере мои данные анализируются.

7 голосов
/ 04 августа 2009

Я делаю 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 как по их типу, так и по их методу.

2 голосов
/ 30 июня 2010

У меня тоже была эта проблема, и я решил ее с помощью:

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

Также убедитесь, что для «debug» в вашем конфигурационном файле установлено значение меньше 2, иначе заголовок не будет установлен.

1 голос
/ 04 августа 2009

Я не уверен (и, если честно, я никогда не использовал CakePHP), но вы можете попытаться указать второй аргумент в методе setContent ..

заменить это:

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

с этим:

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

см. этот файл для примера ..

0 голосов
/ 11 ноября 2010

У меня возникла та же проблема, что и у оригинального плаката, и мне помогло последовать совету Роба Уилкерсона, но также убедиться, что я использовал

jQuery.ajax()

вместо

jQuery.get()

или

jQuery.post()

jQuery.ajax () позволяет установить для dataType значение «json», тогда как другие два, похоже, вообще не позволяют устанавливать тип данных. Когда я установил тип данных в запросе AJAX на «json», все заработало как надо.

...