我想在我的CakePHP应用程序中创建一个RESTful API,但它描述的唯一方法是使用扩展(也就是文件扩展名)https://book.cakephp.org/3.0/en/development/routing.html#creating-restful-routes但是考虑到我实际上有JSON,这对我来说是不可行的我不希望与CakePHP混淆的文件,不仅如此,但是在路径的末尾添加.json
或其他内容可能会被遗漏并且省略它并不会改变它实际上会去那里导致错误显示。
有没有办法在不使用扩展名的情况下创建RESTful路由?
答案 0 :(得分:2)
RESTful路由无需扩展即可。扩展是请求处理程序组件如何配置呈现和响应过程的一部分,路由本身将正常工作而不指定扩展。
看起来文档有点过时,描述代码示例的句子没有任何意义:
第一行设置了许多默认路由以便于REST访问,其中method指定所需的结果格式(例如xml,json,rss)。这些路由是HTTP请求方法敏感的。
我想这属于旧的代码示例。您可能需要报告此over at GitHub。
Accept
标题话虽如此,请求处理程序组件还会评估Accept
标头,因此您可以向您的API发送application/json
。
此外,如果您根本不想接受非JSON请求,则应检查Request::is()
并相应地抛出异常。
if (!$this->request->is('json')) {
throw new \Cake\Network\Exception\BadRequestException():
}
此外,可以覆盖请求处理程序确定的扩展,并使组件认为这是一个JSON请求:
$this->RequestHandler->ext = 'json';
应该注意,这不会影响像RequestHandler::prefers()
!
最后,您还可以使用RequestHandler::renderAs()
方法告诉请求处理程序如何呈现和响应:
$this->RequestHandler->renderAs($this, 'json');
然而,这需要在Controller.beforeRender
事件中完成,以便在它识别通常需要处理的类型的请求时覆盖组件行为。