[英]How to implement complex conditional bulk partial updates via JSON API?
HTTP协议中有POST
和PATCH
方法,用于部分更新。 在JSON API的PATCH
方法上有RFC 5789 , RFC 6902 , RFC 7396 。
但我有一个特定于大型资源的问题,需要在相当复杂的条件下进行部分更新。
假设我们有一个API endpont "/members"
,它类似于一个包含数千个条目的大型集合,其中每个条目都有几十个字段。 因此,客户端通过"GET /members?fields=f1,f2,f3"
方法部分读取这些值"GET /members?fields=f1,f2,f3"
并且每个客户端只读取当前任务所必需的字段子集。
为简化问题,我们假设任何条目都有一个必需的"email"
字段用于标识和几个可选字段。
{
"email": "user@organization.com",
"optional1": "x",
"optional2": "x",
"optional3": "x"
}
我们有两个并行工作的客户端批量创建和更新新记录。 但是每个客户端都希望仅覆盖其可选字段的子集。
因此,客户端A将发送一个请求, A
包含批量修补程序的A
值,只允许覆盖"optional1"
字段值,因为该字段对其任务至关重要。 该客户端还将为新条目指定"optional2"
字段的值。 该客户端根本没有指定"optional3"
字段。
{
"email": "user@organization.com",
"optional1": "A",
"optional2": "A"
}
虽然该记录是新的,但它完全写入存储。 然后,客户端B将发送一个带有B
值的请求,用于批量补丁,只允许覆盖"optional2"
字段值,因为该字段对于他们的任务是必不可少的。
{
"email": "user@organization.com",
"optional1": "B",
"optional2": "B",
"optional3": "B"
}
由于记录已经存在,该记录的"optional1"
字段应保留相同的旧值A
因为该字段不是必需的, "optional2"
字段值应该用新值B
覆盖,因为该字段是必需的,并且"optional3"
字段值应该接收值B
因为该字段只是空的。 行动的合并结果应如下。
{
"email": "user@organization.com",
"optional1": "A",
"optional2": "B",
"optional3": "B"
}
因此,行为取决于记录的存在。 你们如何在JSON API可重用端点方法中实现这一点,以便对具有复杂条件的此类集合的并发并行部分更新,如果该记录已经存在且包含某些值,那么该API的客户端只会覆盖记录中的一部分字段?
RFC 6902解决方案不匹配,因为它们的add
和replace
操作实际上都替换了一个值。
add - 如果目标位置指定了确实存在的对象成员,则替换该成员的值。
replace - “替换”操作用新值替换目标位置的值。 操作对象必须包含一个“value”成员,其内容指定替换值。
您可以看到它与Java Map.put()方法的匹配方式。
如果映射先前包含键的映射,则旧值将替换为指定的值。
但缺少的功能与Java Set.add()方法相匹配。
如果指定的元素尚不存在,则将其添加到此集合(可选操作)。 更正式地,如果集合不包含元素e2,则将指定的元素e添加到该集合中(e == null?e2 == null:e.equals(e2))。 如果此set已包含该元素,则调用将保持set不变并返回false。
您如何制作一个JSON API,允许两个类型的操作用于包含大量可选字段的大型集合的批量修补程序?
感谢@ chad-jensen关于属性优先级排序规则的想法。 上述文档提供了非常灵活的方法,因此我尝试根据自己的需要进行定制。 我想我将有两个操作,“初始化”具有较低的优先级,“添加”或者更确切地说“替换”具有更高的优先级。
然后,在我的示例中,客户端A和客户端B发送的JSON数据如下。
通过客户端发送的数据A
,其更新"optional2"
低优先级字段并更新"optional1"
具有最高优先级字段。
{
"email": "user@organization.com",
"initialize":
{
"optional2": "A"
},
"replace":
{
"optional1": "A"
}
}
客户端B
发送的数据,更新具有较低优先级的"optional1"
和"optional3"
字段,并更新具有最高优先级的"optional2"
字段。
{
"email": "user@organization.com",
"initialize":
{
"optional1": "B",
"optional3": "B"
},
"replace":
{
"optional2": "B"
}
}
您需要某种优先级映射,以确定哪些字段为每个客户端设置优先级。
看起来你已经拥有了,但我会假设它存储在某个地方/服务器和/或客户端知道哪个字段具有最高优先级(优先级)。 您可能还需要知道哪个客户端上次更新了每个字段。
话虽如此,您应该能够对每个属性执行null / empty / check,并且仅在值为默认值(null /空字符串)时替换值。 在已填充值的方案中,您将需要检查传入客户端的优先级是否高于/上次更新该值的优先级。
我找到了一份文件,可能会澄清我的意思(它对某些第三方工具有一点具体,但概念就在那里): https : //www.ibm.com/support/knowledgecenter/en/SSPLFC_7.2.0/UserGuide /c_cmdb_reconcilation_overview.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.