2014-02-18 6 views
0

У меня есть это в моем файле маршрутов: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, нужно ли мне что-то еще где-то отображать?

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

+0

Ваше ожидание ошибочно. Вывод должен всегда соответствовать файлу/расширению. Таким образом, вам всегда нужно расширение json для ответов JSON. И если вы используете xml, вы получаете XML, если вы не используете расширение, вы получаете HTTP. так оно и должно работать. Не то, что вы ожидаете. См. [AJAX и CakePHP] (http://www.dereuromark.de/2014/01/09/ajax-and-cakephp/). И если вы хотите только JSON, убедитесь, что все остальные ошибки (4xx) правильно. – mark

ответ

3

Если вы хотите, чтобы сделать все от конкретного контроллера (в вашем случае, 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. Если довольны тем, что вы можете даже удалить расширение ловец в вашем routes.php файла ...

Router::parseExtensions('json'); 

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

Дальнейшая разработка с использованием файла beforeFilter вы можете визуализировать как разные типы контента в зависимости от типа запроса. Например:

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

вы не адресуете второй пункт (хотя tbh я не знаю, в чем проблема - недостаточно деталей) +1 для примера обработчика запроса. – AD7six

+1

Спасибо. Код, который я опубликовал, работает как для запросов GET, так и для POST, также разрешая первую проблему. Кроме того, я только что расширил ответ, чтобы содержать информацию о том, как обрабатывать типы запросов по-разному, хотя этого не задавали. – Happy

+0

Улыбается, это делает тайные оба вопроса. – Mark

Смежные вопросы