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

时间:2013-05-03 11:18:42

标签: rest resources naming-conventions uri

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,它们总是与一个对象/模型一起使用。
  4. 更好的方法是什么?

4 个答案:

答案 0 :(得分:6)

没有严格的定义RESTful API的准则,但我最常阅读的是常识应占优势。

因此,选项3:

  

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

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

答案 1 :(得分:4)

我不是说我更喜欢复数,但如果你要使用复数,你可以用这种方式调和你的特殊单曲:

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。

答案 2 :(得分:2)

REST(Representational state transfer)基本上是针对单个实体并对其进行CRUD。所以使用单数对我来说更有意义。但是如果你需要获得列表,那么复数就有意义了。例如:

您希望获得用户/ api / user / {id}

但是如果你想获得用户列表,那么就有/ api / users

答案 3 :(得分:2)

我在这些年来一直在研究的一些项目中看到的是,对于大多数常见操作,单数看起来更友好,例如,您可以为用户资源提供以下端点:

GET /user  --> retrieves all users
GET /user/{id} --> retrieves a user with the given id
POST /user --> inserts a new user (the user object will come in the request body)
PUT /user/{id} --> updates a user with the given id (the user object will come in the request body)
DELETE /user/{id} --> deletes the user with the given id

这些是常见的操作,当你进行批量插入/更新/删除操作时,最好使用复数

POST /users  (the user objects will come in the request body)
PUT /users/{listOfIds}  (the user objects will come in the request body)
DELETE /users/{listOfIds}

GET / user和GET / users将是同义词,这两个人会接受查询参数来细化结果,例如。

GET /users?status=active