如何在不使用扩展的情况下在Cake3中创建RESTful路由?

时间:2017-11-22 20:54:55

标签: json rest cakephp

我想在我的CakePHP应用程序中创建一个RESTful API,但它描述的唯一方法是使用扩展(也就是文件扩展名)https://book.cakephp.org/3.0/en/development/routing.html#creating-restful-routes但是考虑到我实际上有JSON,这对我来说是不可行的我不希望与CakePHP混淆的文件,不仅如此,但是在路径的末尾添加.json或其他内容可能会被遗漏并且省略它并不会改变它实际上会去那里导致错误显示。

有没有办法在不使用扩展名的情况下创建RESTful路由?

1 个答案:

答案 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事件中完成,以便在它识别通常需要处理的类型的请求时覆盖组件行为。

另见