补丁 vs merge-patch 哪个合适?

Patch vs merge-patch which is appropriate?

尝试查看哪些模型最适合 api(低更新,但 object 结构可能经常更改,高读取应用程序)

我有这样的资源

  1. Epic (id, name, description, start date, close date, status, 故事)
  2. 故事(id、名称、描述、开始日期、结束日期、状态、任务
  3. 任务 (id, name, description, start date, resolution date, 分辨率)

如果我只需要支持这些更新,

  1. 更新史诗名称或描述或日期或状态
  2. 更新故事名称或描述或日期或状态
  3. 更新任务名称或描述或日期或状态

哪个有道理?

PATCHapplication/merge-patch+json RFC 7396

资源应该匹配目标object结构

  1. epics/{id}
  2. epics/{id1}/stories/{id2} ..等等

PATCHapplication/json - 我倾向于选择这个 因为没有必要那么严格强制执行 RFC 7396 和更新规则的灵活性。

您要更新的自定义规则(但从技术上讲 - 我可以只发送需要更新的资源属性,类似于 application/merge-patch+json

  1. epics/{id}
  2. epics/{id1}/stories/{id2} ..等等

PUTapplication/json

资源应匹配所有字段并创建新的 object 并替换(或作弊并仅像补丁中那样更新)

  1. epics/{id}
  2. epics/{id1}/stories/{id2} ..等等

PUTapplication/json

或者作弊,只像在补丁中那样更新,但使用 put

  1. epics/{id}
  2. 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