CakePHP (2.4) маршрутизирует json

У меня есть это в моем файле маршрутов:

CakePlugin::routes();
Router::mapResources('api');
Router::parseExtensions('json');

В настоящее время, если я вызываю контроллер, у меня есть Api с .json в качестве расширения, если это HTTP GET (не сообщение), он выводит json, что нормально, независимо от имени метода/функции, пока он существует в моем контроллере Api.

Если я делаю сообщение, в то время как я могу декодировать опубликованный JSON, какую бы функцию/метод я ни вызывал, появляются ошибки, говорящие, что мне не хватает xxx.ctp в app/Api/Views/json/ xxx.ctp = имя любой функции Я позвонил, чтобы опубликовать.

2 Вопросы/проблемы.

В идеале я хочу анализировать любой запрос к контроллеру API как json, но без указания расширения .json в URL-адресе.

Во-вторых, как/почему HTTP POST не может выводить json, как HTTP GET, нужно ли мне где-то сопоставлять что-то еще?

Большое спасибо


person Mark    schedule 18.02.2014    source источник
comment
Ваше ожидание ошибочно. Вывод всегда должен соответствовать типу/расширению файла. Таким образом, вам всегда нужно расширение json для ответов JSON. И если вы используете xml, вы получаете XML, если вы не используете расширение, вы получаете HTTP. так это должно работать. Не то, что вы ожидаете. См. AJAX и CakePHP. И если вам нужен только JSON, убедитесь, что все остальные ошибки (4xx) правильно.   -  person mark    schedule 19.02.2014


Ответы (1)


Если вы хотите визуализировать все с определенного контроллера (в вашем случае ApiController.php) в виде JSON, не требуя от пользователя добавления расширения .json по его запросу, вы можете использовать renderAs и setContent в вашем beforeFilter.

    public function beforeFilter() {
       parent::beforeFilter();
       $this->RequestHandler->setContent('json');
       $this->RequestHandler->renderAs($this, 'json');
    }

renderAs и setContent являются частью RequestHandler.

Это означает, что этот контроллер никогда не вернет ничего, кроме json. Если вас это устраивает, вы даже можете удалить ловушку расширения в файле route.php...

Router::parseExtensions('json');

Помните, что если вы удалите указанную выше строку из вашего файла route.php, любой запрос к вашему ApiController приведет к выдаче 404 (не как JSON).

При дальнейшем развитии с использованием beforeFilter вы можете отображать различные типы контента в зависимости от типа запроса. Например..

    public function beforeFilter() {
       parent::beforeFilter();
           if ($this->RequestHandler->isGet()) {
               $this->RequestHandler->setContent('json');
               $this->RequestHandler->renderAs($this, 'json');
           }
    }
person Happy    schedule 19.02.2014
comment
вы не обращаетесь ко второму пункту (хотя я не знаю, в чем проблема - недостаточно подробностей) +1 за пример обработчика запросов. - person AD7six; 19.02.2014
comment
Спасибо. Код, который я опубликовал, работает как для запросов GET, так и для POST, решая и первую проблему. Кроме того, я только что расширил ответ, чтобы он содержал информацию о том, как по-разному обрабатывать типы запросов, хотя об этом не просили. - person Happy; 19.02.2014
comment
Ура, это действительно скрывает оба вопроса. - person Mark; 19.02.2014