2013-05-03 65 views
7

REST API的复数形式更自然,更多使用,例如/api/usersapi/users/123混合REST API复数和单数为不同的资源?

但对于一些资源是不自然的。例如:

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

这个资源永远不会被用于更多在我的应用程序中的一个对象/模型。

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

所以我认为做什么:

  1. 使用奇异所有
  2. 使用多种对所有(有一些愚蠢的格式,如:/api/logins
  3. 是不一致的,并使用复数几乎所有资源的预期一些特殊资源,如/api/login/api/profile,它们总是与一个对象/模型一起使用。

什么是更好的方法?

+0

我遵循与数据库表相同的规则:单数。这是产品表,而不是产品表。你得到一个产品或一套产品。没有必要用你的名词来处理变调;你得到一个实体或一组实体。 – 2016-09-07 00:51:32

回答

6

对于定义RESTful API没有严格的指导原则,但我读到的最多的是常识应该占上风。

因此,选项3:

是不一致的,并使用复数的几乎所有资源期待一些特殊资源,如/ API /登录或总是与一个对象/模型中使用/ API/profile文件。

是最合乎逻辑的。当你认为“我需要资源X,这个URL将如何”时,你应该始终能够猜出URL?

2

REST(具象状态传输)基本上针对单个实体并对其进行CRUD。所以使用单数对我来说更有意义。但是如果你需要得到清单,那么复数是有意义的。例如:

你想那么用户有/ API /用户/ {ID}

但是,如果你想获得用户的列表,然后有/ API /用户

+0

事实上的标准是使用GET/entity?filter =多个和GET/entity/{id}作为单个。您的实体没有降级要求;你会得到单数实体或实体集合/列表/系列。它本身不是“实体”,而是实体集合,列表或系列。 – 2016-09-07 00:55:09

3

我不是说我更喜欢复数形式,但是如果您使用复数形式,可以通过以下方式协调您的特殊单数形式:

GET /api/forms/login是HTML登录表单。使用这种观点,login是表单集合中的一种形式的ID。

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

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

GET /api/profiles/{id}将配置文件实体从用户标识中分离出来,并可用于匿名网站。

或者,您可以编写GET /api/users/current/profileGET /api/sessions/current/profile,由于服务器将回复与当前用户相关的内容,因此会忽略特定的ID,如在您的帖子中。

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 /用户和GET /用户将是同义词,这两个会接受查询参数改进结果,例如

GET /users?status=active 
+0

为什么GET/users不能检索所有用户? – 2015-07-15 18:31:27

+0

是的GET /用户应该被用作GET/user的同义词,在上面提到的方法中,我只是添加了该评论 – raspacorp 2015-07-15 21:50:12