我的情况是我有类似购物车的东西。我有一组具有已知ID的产品,然后我想创建一个具有修改价格的子集,然后修改此子集
超集
[{
"productId":1,
"price":1.99
},
{
"productId":2,
"price":2.99
},
{
"productId":3,
"price":3.99
},
{
"productId":4,
"price":4.99
}]
...
修改后的子集
[{
"productId":1,
"price":1.59
},
{
"productId":3,
"price":2.59
}]
然后我想再次修改子集看起来像
[{
"productId":1,
"price":1.79
},
{
"productId":2,
"price":3.59
}]
我能想到的是客户端发送一个像
这样的POST请求{
"productsAdded":[
{
"productId":2,
"price":3.59
}
],
"productsModified":[
{
"productId":1,
"price":1.79
}
],
"productsDeleted":[
{
"productId":3,
"price":2.59
}
]
}
约束是我想避免多次调用来纠正动词而不是发送整个子集。由于实际对象具有更多字段,并且子集中有数千个对象。然后更新保存状态触发器长时间运行并忘记任务。
我看到的问题是客户端可能需要创建一个delta 状态和服务器必须从消息中重建状态。
这可能不是一个坏方法,但我想知道是否有其他解决方案
答案 0 :(得分:3)
以RESTful方式更新集合
Atom Publishing Protocol是围绕修改REST架构风格中的原子条目集合的想法而构建的。您可以从审查该设计开始。
我能想到的是客户端发送一个像
这样的POST请求
这非常接近JSON Patch代表。
这个想法是,如果客户端和服务器共享相同(通常是标准化的)对媒体类型的理解,那么即使它们是独立开发的,它们也可以继续协作。
因此,使用POST将更改的JSONPatch表示传递给资源是一个很好的起点;如果您不喜欢JSONPatch(可能因为它是域不可知的),您可以定义自己更具体的媒体类型并使用它。
(注意:虽然消息类型称为“补丁”,但实际上并不需要在API中使用PATCH method。POST本身,PATCH本身或两者都是可接受的替代方案。)
答案 1 :(得分:-1)
您提出的解决方案包含您提到的所有警告以及更多内容。建议:
其他参考链接: