使用PATCH对数组进行粒度更新。

时间:2018-01-26 09:44:40

标签: json rest

我使用REST从目标服务器获取资源并获取此信息:

{
  "a" : [1,2], 
  "b": 1
}

我理解,当我想要更新时,最好使用PATCH代替PUT整个事情,以避免在我拥有的时间内覆盖对该资源所做的任何更改拉着它,把它推回来的时间。

刚刚阅读this以了解如何正确使用PATCH,我尝试使用它来细化我对数组的更新。我想将第二个数组元素更新为值1。

REQUEST:
[
  {"op" : "add", "path": "/a/1", "value" : 1 }
]
RESULT:
  {
    "a": [1,1,2]
    "b": 1
  }

啊!我不使用add,我使用replace,因为add会导致插入。所以我改变了:

REQUEST:
[
  {"op" : "replace", "path": "/a/1", "value" : 1 }
]

现在可能会出错。因为在我提取资源并将其推回的时间内,可能会对数组a进行任何数量的更改。特别是,当前包含2的第二个数组元素可能已被完全删除。 replace尝试替换现有元素,如果第二个数组元素不存在则会出错 - 在这种情况下,add将成为解决方案。

我不知道如何对数组进行细粒度的调整。在这一点上,我唯一能看到这种错误的方法是:

[
  {"op" : "replace", "path" : "/a", "value": [1,1]}
]

它可能没有错误但是很糟糕,因为我重新发送了第一个数组元素的值,这个元素可能在那段时间内被修改过。

数组不仅包含原始值,它们可以包含任何嵌套的对象结构。好像我想要更新数组的一部分,我仍然需要完整地发送数组的其余部分。但是这让我回到了使用PUT的原始问题 - 我可以覆盖自从我抓取资源以来对其他数组元素所做的任何更改。

这里有解决方案吗?

1 个答案:

答案 0 :(得分:0)

  

现在可能会出错。因为在我拉动资源并将其推回的时间内,可能会对数组进行任何数量的更改

是。但是你可以使用test

来检查
  

“test”操作测试目标位置的值是否等于指定值。

更一般地说,您还可以考虑使用更通用的conditional requests机制与原始服务器进行通信,以期将补丁应用于哪个版本的资源,例如通过包含{{3} }。