在 RESTful API 中,许多小接口或更少的大接口哪个更好?

What is better many small interfaces or less big interfaces in RESTful API?

我想为移动应用程序创建更好的 RESTful API。一个简单的例子:

user model:
 - firstname
 - lastname
 - gender

services:
GET /users          => list of all users
POST /users         => create a new user
PUT /users          => update a bulk of users
GET /users/{id}     => one special users
PUT /users/{id}     => update a special user

最好创建这样的小界面而不是 PUT /users/{id} ?:

PUT /usersFirstname/{id}
PUT /usersLastname/{id}
PUT /usersGender/{id}

一方面,移动应用程序只发送更改后的值,而不是 hole 用户模型。但另一方面,我有很多方法几乎相同的业务逻辑和更多的维护。

是否有最佳实践方法?

通常 Web 界面应该是矮胖的而不是喋喋不休的,因此您可能应该 post 整个用户一次。 Microsoft API implementation guidance

中也提到了这一点

REST 资源

REST 的关键概念是资源。这就是 Roy T. Fielding 在他的博士论文 chapter 5 中定义 资源 的方式(论文中没有亮点):

5.2.1.1 Resources and Resource Identifiers

The key abstraction of information in REST is a resource. Any information that can be named can be a resource: a document or image, a temporal service (e.g. "today's weather in Los Angeles"), a collection of other resources, a non-virtual object (e.g. a person), and so on. In other words, any concept that might be the target of an author's hypertext reference must fit within the definition of a resource. A resource is a conceptual mapping to a set of entities, not the entity that corresponds to the mapping at any particular point in time.

[...]

REST uses a resource identifier to identify the particular resource involved in an interaction between components. [...]

一项资源必须有至少一个 URI 来识别它。 URI 是资源的名称地址。从概念上讲,您有一个 user 资源,因此您需要一个 URI。所以必须采用以下方法:

GET /users          # list of all users
POST /users         # create a new user
PUT /users          # update a bulk of users
GET /users/{id}     # one special users
PUT /users/{id}     # update a special user

当您拥有 user 资源时,以下内容毫无意义:

PUT /usersFirstname/{id}
PUT /usersLastname/{id}
PUT /usersGender/{id}

正在执行部分更新

要处理部分更新,请使用 PATCH HTTP 动词。 PUT HTTP 动词应该用于用新的表示替换整个资源。

对于部分更新,一些方法将主资源的字段视为子资源。然后 PUT 可以用来用新的表示替换子资源。类似于:

PUT /users/{id}/firstname
PUT /users/{id}/lastname
PUT /users/{id}/gender

我并不是说这是方法。这只是执行部分更新的另一种方法。

检索部分表示

要检索资源的部分表示,请使用 content negotiation or a query string parameter to filter the fields