在 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。
我想为移动应用程序创建更好的 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。