使用CakePHP中的RESTful api防止默认视图

时间:2011-12-08 11:31:53

标签: json cakephp rest

我正在关注解释设置RESTful网络服务基础知识的tutorial in the CakePHP book

到目前为止,我已将路线文件更新为以下内容:

Router::mapResources('stores');
Router::parseExtensions('json');

我还在app / layouts / json和相应的json视图中设置了一个空白布局。当我导航到controller / action.json

时,我成功收到了json输出

我很想知道,如果没有.json扩展名,它会尝试加载常规视图。我期待构建一个只有json输出的纯api,有没有办法阻止常规的渲染输出呢?

3 个答案:

答案 0 :(得分:6)

如果您可以通过其他方式识别JSON请求,则可以将渲染强制为JSON。例如,如果Accepts HTTP标头包含application / json,则可以将其放在控制器中:

public function beforeFilter(){
    if ($this->request->accepts('application/json')) {
        $this->RequestHandler->renderAs($this, 'json');
    }
    parent::beforeFilter();
}

它是CakePHP 2.0表示法,但CakePHP 1.2和1.3可能存在类似的东西。

您也可以检测请求Content-Type,或者也可以检测,尤其是在未使用Accepts的情况下。

答案 1 :(得分:0)

目前你看到了什么?如果您已经使用过烘焙Cake可能已经为您生成了视图?

只需删除/app/views/layout/app/views/controllername

中的观看次数即可

如果您试图阻止请求完全按下控制器,那么我不太确定,您可以只更新.htaccess文件,只将以.json结尾的请求发送到应用程序或类似的东西。

答案 2 :(得分:0)

这就是我所做的。

如果我知道我只构建了json API,那么我将添加到我的AppController.php中:

public function beforeFilter()
{
    if (empty($this->request->params['ext']) || $this->request->params['ext'] != "json")
    {
        $this->render(FALSE, 'maintenance'); //no view, only layout
        $this->response->send();
        $this->_stop();
    }
}

和我的/app/Layouts/maintenance.ctp

echo __('Invalid extension');

这样,没有json扩展名的所有请求都将以" maintenance"结束。您可以在其中放置所需信息的页面,我计划将链接指向API文档。