1

我们需要通过 REST API 更新计数器,并且我们使用 JSON Patch 进行 PATCH 调用,所以它应该是这样的:

{"op":"increment", "path":"/counter", "value": 1 }

问题是 JSON Patch 不支持这种类型的操作。ADD 操作应该只适用于数组,因此最接近的解决方案是使用 REPLACE 操作来替换计数器值,但是如果多个客户端同时尝试更新计数器,则可能会导致问题。

那么我们应该如何解决这个问题,添加一个像 increment 这样的自定义操作会有多大的错误呢?

4

2 回答 2

1

问题是 JSON Patch 不支持这种类型的操作。ADD 操作只适用于数组,因此最接近的解决方案是使用 REPLACE 操作来替换计数器值

替换是正确的答案。

如果多个客户端同时尝试更新计数器,这可能会导致问题。

仔细查看test,它为您提供了描述前提条件所需的语义。实际上,您的文档变成了比较和交换的描述。

添加像 increment 这样的自定义操作会有多错?

一路走错。 RFC 6902 明确指出不能扩展操作集

操作对象必须只有一个“op”成员,其值指示要执行的操作。它的值必须是“add”、“remove”、“replace”、“move”、“copy”或“test”之一;其他值是错误。

当然,您可以定义一个包含您需要的运算符的新规范。但是您自己的虚荣补丁文档不会有那么多工具。

从更大的角度来看,如果您试图传达“增量”而不是“设置”,那么远程创作语义可能不是正确的选择——问题可能是试图告诉您手头有错误的工具.

于 2020-01-14T20:05:22.737 回答
0

即使标准不支持这一点,这也不会改变这是一个非常有效的用例这一事实。

举个例子,CosmosDB 增加了对这个高度要求的功能的支持:https ://docs.microsoft.com/en-us/azure/cosmos-db/partial-document-update#supported-operations

我不同意接受的、固执己见的答案。标准和规范并非万无一失。

由于规范限制,我认为您最好的选择是创建一个新的专用增量操作。

于 2022-03-01T11:32:42.260 回答