我想知道在WebApi .Net Core中设计对资源的多个更新的最佳方法是什么。
例如,我想为users
资源启用以下功能
- 更新用户密码
- 更新用户角色
- 更新用户详细信息(例如名字、姓氏等)
因此,根据 REST 教程和文章,我了解到我需要使用PATCH
方法来更新部分资源。
我们在团队中进行了一些讨论,我们对以下两个选项感到困惑:
选项 1
为不同的操作实现多个 PATCH 路由
- 补丁
/api/users/{id}/password
- 补丁
/api/users/{id}/role
- 补丁
/api/users/{id}/details
选项 2
仅对整个资源实施单个 PATCH 操作。 用户将发送application/json-patch+json进行部分更新。
- 补丁
/api/users/id
(接受JsonPatchDocument
参数)
我试图找到 Restful 路由命名的最佳实践,其中大多数只涵盖简单的 CRUD 活动或嵌套资源。
对于这种多次更新操作,我可以知道命名路由的最佳实践是什么吗? 还是深入研究的术语? 谢谢。
PATCH
请求用于更新单个资源的一部分,即只应替换资源字段的特定子集。语义最好描述为"请根据我的更改请求更改 URL 标识的资源"。
PATCH
请求通常应用于单个资源,因为修补整个集合具有挑战性PATCH
请求通常对不存在的资源实例不可靠- 在成功的
PATCH
请求中,服务器将更新由有效负载中的更改请求定义的 URL 寻址的部分资源 - 成功的
PATCH
请求通常会生成200
或204
(如果资源已更新,返回或不返回更新的内容)
注意:由于正确实现PATCH
有点棘手,因此我强烈建议为每个端点选择以下模式之一。按优先顺序:
- 使用带有完整对象的
PUT
以尽可能长地更新资源(即根本不使用PATCH
)。 - 尽可能将
PATCH
与部分对象一起使用,以便仅更新资源的一部分。(这基本上是 JSON 合并修补程序,这是一种专门的媒体类型application/merge-patch+json
,是部分资源表示形式。 - 将
PATCH
与 JSON 修补程序一起使用,JSON 修补程序是一种专用媒体类型application/json-patch+json
,其中包含有关如何更改资源的说明。 - 如果请求未以媒体类型语义定义的方式修改资源,请使用
POST
(对正在发生的事情进行正确描述)而不是PATCH
。
选项 1的设计似乎很糟糕,因为每个属性都有很多终结点。
选项 2遵循 REST 建议,并在 RFC 6902 中指定
您可以通过以下方式实现它:
- Delta(Microsoft ASP.NET WebAPI OData的一部分):使用JSON时,它在数字方面存在一些问题。您还需要安装软件包及其所有重要的依赖项;
- JSON 补丁:客户端必须组织每个操作的数据,并且请求的大小未优化。
- 使用Simple.HttpPatch,可以轻松应用部分更新
- 另一个 SimplePatch 实现
路线命名
-
资源名称使用复数名词。不要混淆单数和复数名词。保持简单,对所有资源只使用复数名词(
users
,而不是user
) -
如果每个资源有两个基本 URL,则第一个 URL 用于集合(列表);第二个 URL 用于集合中的特定元素(
/users
和/users/1
) -
如果您有关系,请为其使用子资源
/users/1/
phones/1 - 返回用户 1 的电话 #1
将动词排除在基本 URL 之外。使用 HTTP 请求方法
GET
、POST
、PUT/PATCH
、DELETE
以及两个基本 URL 进行 CRUD 操作。关键是开发人员可能不需要文档来了解 API 的行为方式。换句话说,您将拥有一长串 URL,并且没有一致的模式,这使得开发人员难以学习如何使用您的 API复杂的事情需要隐藏在
?
后面。几乎每个 API 都有很多参数,您可以以任何其他方式读取、更新、过滤和使用它们。但所有这些参数在基址中都不可见。最好在对基址的引用中指定参数。
GET/users/1234?firstName=Bill&PhoneNumber="1111">
另请参阅链接
- Microsoft REST API 指南
- Zalando RESTful API
- 网页接口设计