补丁 vs merge-patch 哪个合适?
Patch vs merge-patch which is appropriate?
尝试查看哪些模型最适合 api
(低更新,但 object 结构可能经常更改,高读取应用程序)
我有这样的资源
- Epic (id, name, description, start date, close date, status,
故事)
- 故事(id、名称、描述、开始日期、结束日期、状态、任务)
- 任务 (id, name, description, start date, resolution date,
分辨率)
如果我只需要支持这些更新,
- 更新史诗名称或描述或日期或状态
- 更新故事名称或描述或日期或状态
- 更新任务名称或描述或日期或状态
哪个有道理?
PATCH
与 application/merge-patch+json
RFC 7396
资源应该匹配目标object结构
- epics/{id}
- epics/{id1}/stories/{id2} ..等等
PATCH
和 application/json
- 我倾向于选择这个 因为没有必要那么严格强制执行 RFC 7396
和更新规则的灵活性。
您要更新的自定义规则(但从技术上讲 - 我可以只发送需要更新的资源属性,类似于 application/merge-patch+json
)
- epics/{id}
- epics/{id1}/stories/{id2} ..等等
PUT
与 application/json
资源应匹配所有字段并创建新的 object 并替换(或作弊并仅像补丁中那样更新)
- epics/{id}
- epics/{id1}/stories/{id2} ..等等
PUT
与 application/json
或者作弊,只像在补丁中那样更新,但使用 put
- epics/{id}
- epics/{id1}/stories/{id2} ..等等
从 REST 的角度来看,要牢记的重要一点是统一接口——您拥有一些具有 application/json
表示的资源。我可以 GET
您的表示,并使用我最喜欢的任何工具对其进行本地编辑。
如果我想提议更改资源以匹配我的表示,我们从 HTTP 协议中选择适当的方法。换句话说,HTTP 中的方法都是“通过网络传输此文档”域的一部分。 (参考:Jim Webber, 2011)。
所以实际上,支持“所有这些”是确保可以使用最广泛的通用客户端与您的资源进行交互的方法。
PUT /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json
非常合理的起点;它有几个优点 - 语义是 idempotent, so clients know that a lost request can be repeated, and HTTP PUT 包括重要用例的语义,例如我们接受您的表示,这样可以减少网络压力。
当表示比变化大得多时,PUT 可能是一个不幸的选择。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: ????
这是处理对大型表示的微小更改的完全合理的方法。您放弃了 PUT 的一些优点 - 丢失的消息现在处理起来更加复杂。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json
没有任何困难。 application/json
不是 patch document 格式——如果没有某种 out-of-band 协议,您无法知道这种表示描述了哪些更改。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/vnd.example.patch+json
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/prs.example.patch+json
这是做前一点的“REST”方式;您定义自定义媒体类型,并记录语义,然后任何实现您的媒体类型的客户端都可以使用它。 vendor tree and vanity tree are available. The +json
bit is the structured syntax name suffix,它为不识别基本子类型的消费者提供结构提示。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json-patch+json
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/merge-patch+json
也是极好的选择,因为这两种类型在RFC 6902 and RFC 7936中已经标准化;您更有可能让客户已经知道这些类型。
了解 HTTP PATCH will presumably also know how to use the OPTIONS method to discover what methods and patch document formats 服务器准备处理的客户端。
OPTIONS /31E772D3-0157-4B52-8243-75EEAB946E65
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, PUT, PATCH
Accept-Patch: application/prs.example.patch+json, application/json-patch+json, application/merge-patch+json
尝试查看哪些模型最适合 api
(低更新,但 object 结构可能经常更改,高读取应用程序)
我有这样的资源
- Epic (id, name, description, start date, close date, status, 故事)
- 故事(id、名称、描述、开始日期、结束日期、状态、任务)
- 任务 (id, name, description, start date, resolution date, 分辨率)
如果我只需要支持这些更新,
- 更新史诗名称或描述或日期或状态
- 更新故事名称或描述或日期或状态
- 更新任务名称或描述或日期或状态
哪个有道理?
PATCH
与 application/merge-patch+json
RFC 7396
资源应该匹配目标object结构
- epics/{id}
- epics/{id1}/stories/{id2} ..等等
PATCH
和 application/json
- 我倾向于选择这个 因为没有必要那么严格强制执行 RFC 7396
和更新规则的灵活性。
您要更新的自定义规则(但从技术上讲 - 我可以只发送需要更新的资源属性,类似于 application/merge-patch+json
)
- epics/{id}
- epics/{id1}/stories/{id2} ..等等
PUT
与 application/json
资源应匹配所有字段并创建新的 object 并替换(或作弊并仅像补丁中那样更新)
- epics/{id}
- epics/{id1}/stories/{id2} ..等等
PUT
与 application/json
或者作弊,只像在补丁中那样更新,但使用 put
- epics/{id}
- epics/{id1}/stories/{id2} ..等等
从 REST 的角度来看,要牢记的重要一点是统一接口——您拥有一些具有 application/json
表示的资源。我可以 GET
您的表示,并使用我最喜欢的任何工具对其进行本地编辑。
如果我想提议更改资源以匹配我的表示,我们从 HTTP 协议中选择适当的方法。换句话说,HTTP 中的方法都是“通过网络传输此文档”域的一部分。 (参考:Jim Webber, 2011)。
所以实际上,支持“所有这些”是确保可以使用最广泛的通用客户端与您的资源进行交互的方法。
PUT /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json
非常合理的起点;它有几个优点 - 语义是 idempotent, so clients know that a lost request can be repeated, and HTTP PUT 包括重要用例的语义,例如我们接受您的表示,这样可以减少网络压力。
当表示比变化大得多时,PUT 可能是一个不幸的选择。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: ????
这是处理对大型表示的微小更改的完全合理的方法。您放弃了 PUT 的一些优点 - 丢失的消息现在处理起来更加复杂。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json
没有任何困难。 application/json
不是 patch document 格式——如果没有某种 out-of-band 协议,您无法知道这种表示描述了哪些更改。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/vnd.example.patch+json
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/prs.example.patch+json
这是做前一点的“REST”方式;您定义自定义媒体类型,并记录语义,然后任何实现您的媒体类型的客户端都可以使用它。 vendor tree and vanity tree are available. The +json
bit is the structured syntax name suffix,它为不识别基本子类型的消费者提供结构提示。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json-patch+json
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/merge-patch+json
也是极好的选择,因为这两种类型在RFC 6902 and RFC 7936中已经标准化;您更有可能让客户已经知道这些类型。
了解 HTTP PATCH will presumably also know how to use the OPTIONS method to discover what methods and patch document formats 服务器准备处理的客户端。
OPTIONS /31E772D3-0157-4B52-8243-75EEAB946E65
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, PUT, PATCH
Accept-Patch: application/prs.example.patch+json, application/json-patch+json, application/merge-patch+json