1

RFC 6902明确地定义了很多东西。除了两个相关的事情:

  1. 如何修补连接到资源的表?
  2. 当连接有多行时?

例如。

GET /news/123

[
    {"title": "Hello", "contents": "World", "categories": [1, 2, 3]}
]

结果来自这些数据库表和列:

title = news.title
contents = news.contents
categories = newscategories_mapping WHERE newscategories_mapping.newsID = news.id

所以,如果我发送一个补丁:

PATCH /news/123
[
    {"op": "replace", "path": "/title", "value": "New Title"}
]

这非常简单。但是当我想更新同一资源的类别时呢?IE。“加入”表。

PATCH /news/123
[
    {"op": "replace", "path": "/categories", "value": [4, 5]}
]

另外,请注意两件事:

  • 不包括任何现有值。
  • 金额小于原始值(2 个值而不是 3 个)

假设补丁之前的原始值在newscategories_mapping.id20、21 和 22 中。

问题1:/categories值是否应该4替换id=20,值5替换id=21?还是应该删除 id=20, id=21 和 id=22 并且新值得到新的 ID id=23 和 id=24?

问题 2:即使没有明确要求,是否应该删除 id=22 ?

问题 3:或者根本不应该执行上述操作,而是应该有一个单独的端点来修补每个类别?所以,例如。PATCH /news/123/categories/20PATCH /news/123/categories/21

4

1 回答 1

0

您可以将多个 JSON Patch 段添加到您的请求中。要么所有步骤都被应用,要么根本不应用,所以在事务中应用它们!

PATCH /news/123
[
    {"op": "replace", "path": "/title", "value": "New Title"},
    {"op": "replace", "path": "/categories", "value": [4, 5]}
]

问题 1:新的 /categories 值 4 是否应该替换 id=20,值 5 替换 id=21?还是应该删除 id=20, id=21 和 id=22 并且新值得到新的 ID id=23 和 id=24?

RFC明确说明因此应用补丁后的The "replace" operation replaces the value at the target location with a new value.值应该是 4 和 5。您基本上将现有列表替换为补丁操作中给出的列表。

问题 2:即使没有明确要求,是否应该删除 id=22 ?

是的

问题 3:或者是否应该根本不执行上述操作,而应该有一个单独的端点来修补每个类别?所以,例如。PATCH /news/123/categories/20 和 PATCH /news/123/categories/21?

补丁是由客户端计算的简单指令,服务器应执行以将目标资源转换为预期结果。如果您想在categories元素的最终状态中包含 22,您有两种选择:

  • 将您在操作中发送的值中的旧值添加replace到您要设置的列表中
  • 添加一个额外的add操作,在其他操作被删除后明确添加所需的值

在发送补丁请求之前,客户端应始终从服务器检索最新状态。通常,修改应该应用于最近的状态,因此 ETag 标头用于利用乐观锁定并防止更新过时状态。

于 2017-09-14T18:07:28.633 回答