CakePHP(2.4)路由json

时间:2014-02-18 19:19:38

标签: cakephp cakephp-2.4

我在路线文件中有这个:

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

目前,如果我调用控制器,我将Api与.json作为扩展名,只要它是HTTP GET(不是帖子)它输出json就好了,无论方法/函数名称是什么,只要它存在于我的Api控制器。

如果我发帖,虽然我可以解码已发布的JSON我调用的任何函数/方法,但是错误说我在app / Api / Views / json /中缺少xxx.ctp  xxx.ctp =我要发布的任何函数的名称。

2个问题/问题。

理想情况下,我想将任何请求解析为Api控制器作为json,但无需在url中指定.json扩展名。

其次,如何/为什么HTTP POST输出json不能像HTTP GET一样,我是否需要在某处映射其他东西?

非常感谢

1 个答案:

答案 0 :(得分:3)

如果要将特定控制器(在您的情况下,ApiController.php)中的所有内容呈现为JSON而不要求用户在其请求中附加.json扩展名,则可以在beforeFilter中使用renderAs和setContent。

    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');
           }
    }