rest - 在 CakePHP 中使用带有 RESTful 路由的路由前缀

标签 rest cakephp routes prefix

致力于构建 API 并希望使用 RESTful routes .

我让它像这样工作得很好:

http://www.mysite.com/events.json  // returns json results with my events
http://www.mysite.com/events/123.json // returns json results with event of id '123'

但是 - 我希望能够使用“api”前缀来执行此操作。

所以,我添加了 api 路由前缀:

Configure::write('Routing.prefixes', array('admin', 'api'));

并将我的操作从“view”和“index”更改为“api_view”和“api_index”。

但是现在不行了。 (例如,我必须写下操作名称,否则它不会根据 HTTP 找到正确的名称。

最终目标是能够做这样的事情:

GET http://www.mysite.com/api/1.0/events.json // loads events/api_index()
GET http://www.mysite.com/api/1.0/events/123.json // loads events/api_view($id)
DELETE http://www.mysite.com/api/1.0/events/123.json // loads events/api_delete($id)
...etc

最佳答案

我最终不得不手动编写路由:

Router::parseExtensions('json', 'xml');

Router::connect('/api/:version/:controller/:id/*',
array('[method]'=>'GET', 'prefix'=>'api', 'action'=>'view'),
array('version'=>'[0-9]+\.[0-9]+', 'id'=>'[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'));

Router::connect('/api/:version/:controller/*',
array('[method]'=>'GET', 'prefix'=>'api', 'action'=>'index'),
array('version'=>'[0-9]+\.[0-9]+'));

Router::connect('/api/*', array('controller'=>'events', 'action'=>'index', 'ext'=>'html'));

注意事项:

[method] 强制使用 HTTP 类型(例如 RESTful)

parseExtensions() 让您可以通过更改 URL 中的扩展名自动显示不同格式的数据。

最后的 Router::行只是一个包罗万象的/api/不匹配的东西 - 它将它转发到主页。最终我可能会将其路由到 API 错误页面。

最后一个 Router::行的 'ext'=>'html' 是为了防止 parseExtensions 尝试使用 URL 中的任何扩展名——如果它因为调用的原因而重定向错了,我只是想让它返回主页(或其他)并使用普通 View 。

关于rest - 在 CakePHP 中使用带有 RESTful 路由的路由前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20601162/

相关文章:

php - 如何在 cakephp 3 中编写 MySQL 查询

haskell - 使用 Lucid WebUI 导航 Haskell Servant API

php - 在 laravel 中缺少路由问题所需的参数

azure - OAuth 2.0 {"error_description":"Invalid issuer or signature."} 在 postman 中

java - 使用 Jersey : FormDataContentDisposition is null 上传文件

javascript - 如何在for循环中使用angular http rest api保证顺序?

jquery - 查看客户端浏览器是否支持 PUT/DELETE 方法的编程方式

api - 使用 CakePHP 通过 Put 发送 XML

php - CakePHP 将 `id` = '1' 放在 WHERE 子句中

javascript - 如何在 Promise 被拒绝时将状态代码设置为 404