我正在关注解释设置RESTful网络服务基础知识的tutorial in the CakePHP book。
到目前为止,我已将路线文件更新为以下内容:
Router::mapResources('stores');
Router::parseExtensions('json');
我还在app / layouts / json和相应的json视图中设置了一个空白布局。当我导航到controller / action.json
时,我成功收到了json输出我很想知道,如果没有.json扩展名,它会尝试加载常规视图。我期待构建一个只有json输出的纯api,有没有办法阻止常规的渲染输出呢?
答案 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文档。