我使用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
的原始问题 - 我可以覆盖自从我抓取资源以来对其他数组元素所做的任何更改。
这里有解决方案吗?
答案 0 :(得分:0)
现在可能会出错。因为在我拉动资源并将其推回的时间内,可能会对数组进行任何数量的更改
是。但是你可以使用test
来检查“test”操作测试目标位置的值是否等于指定值。
更一般地说,您还可以考虑使用更通用的conditional requests机制与原始服务器进行通信,以期将补丁应用于哪个版本的资源,例如通过包含{{3} }。