混合REST API复数和单数用于不同的资源?

Mar*_*kLi 9 rest resources uri naming-conventions

REST api的多种形式更自然,更常用,例如/api/usersapi/users/123.

但是对于某些资源来说并不自然,例如:

  • /api/login - 准确登录一个用户
  • /api/profile - 获取已登录用户的个人资料

此资源永远不会用于我的应用程序中的一个对象/模型.

另一方面,我读到在资源名称中混合复数和单数形式并不是一种好的做法(http://pages.apigee.com/web-api-design-ebook.html).

所以我考虑做什么:

  1. 对所有人使用单数
  2. 使用复数(有一些像愚蠢的形式/api/logins)
  3. 为了不一致并且几乎所有资源都使用复数期望一些特殊资源,例如/api/login或者/api/profile总是与一个对象/模型一起使用.

什么是更好的方法?

Mar*_*oDS 7

定义RESTful API没有严格的指导原则,但我最常阅读的是常识应占优势.

因此,选项3:

为了不一致并且几乎所有资源都使用复数期望一些特殊资源,比如/ api/login或/ api/profile,它们总是与一个对象/模型一起使用.

是最合乎逻辑的.当你想到"我需要资源X,这个网址会是什么样子"时,你应该总能猜出网址?


jbu*_*off 5

我并不是说我更喜欢复数,但如果你使用复数,你可以这样调和你的特殊单数:

GET /api/forms/login是 HTML 登录表单。使用这个视角,login是一组表单中只有一个表单的 ID。

POST /api/forms/login 是提交登录表单的地方。

GET /api/users/{id}/profile 检索指定用户的配置文件。这适用于很多情况,但不适用于匿名网站,即使在查看他们的个人资料时,用户的身份也应该保持隐藏,这可能会遗漏他们的用户 ID 和真实姓名。

GET /api/profiles/{id} 将配置文件实体与用户 ID 分离,并适用于匿名站点。

或者,您可以像在您的帖子中那样写GET /api/users/current/profileGET /api/sessions/current/profile省略特定 ID,因为服务器将回复与当前用户相关的内容。