我有两种资源,商店和商品,商店可以通过它的ID唯一标识,商店包含许多不同类型的商品。商品有代码通常用于识别其类型,例如,modelA的导体电缆具有265的代码,代码265的项目可以存在于多个存储器中。 示例HTTP请求及其响应。
GET /stores/1/items
[{
"itemCode": 265,
"itemDescription": "Conductor cable",
"itemModel": "model1",
"uom":"meter",
"quantity": 30
},
{
"itemCode": 122,
"itemDescription": "Low-fat Milk",
"itemModel": "model2",
"uom":"liter",
"quantity": 15
}]
GET /stores/2/items
[{
"itemCode": 265,
"itemDescription": "Conductor cable",
"itemModel": "model1",
"uom":"meter",
"quantity": 25
}]
GET /stores/3/items
[{
"itemCode": 122,
"itemDescription": "Low-fat Milk",
"itemModel": "model2",
"uom":"liter",
"quantity": 20
}]
我想要的是一个REST Api端点,它可以让Api消费者移动,比如说10米的model1导线从商店1到商店2。 我知道可以选择通过更新商店1和2中的数量来实现两个PATCH HTTP请求,但我需要通过单个HTTP请求来实现这一点。
答案 0 :(得分:1)
如果您想使用HTTP PATCH实现此目的,那么JSON Patch - RFC 6902应该证明是有用的。它允许在单个请求中发送多个操作,因此可以同时更新多个资源和属性。如果任何操作失败,那么整个补丁也会失败。但是,在请求中,您必须指定项目的新最终数量。您无法定义要从当前值中减去的操作。因此,为了使此解决方案在多用户环境中工作,乐观锁定机制是必须的。否则就会发生数据损坏。
HTTP POST是一个不错的选择。将一定数量的商品从一个商店转移到另一个商店类似于在银行账户之间转移资金。在这种情况下,我会考虑创建以下端点:POST /stores/item-transfer
。请求正文将包含源存储/ itemCode / itemQuantity和目标存储。所有状态修改都将在单个事务中发生。
我个人赞成POST方法但是如果你坚持使用PATCH而Java是你的语言,那么我建议使用Tomoko库来处理RFC 6902请求。我是它的作者。
答案 1 :(得分:0)
PATCH
并不是非常安宁。我没有看到REST单独解决这个问题的方法,因为它通常只涉及单一资源。
我看到的唯一真正的RESTful方式是为每个模型创建资源(无论如何都应该这样做),并从该模型更改它所属的集合(collection
关系类型)。
我没有在您的示例中看到任何链接,因此我假设您并未真正寻找真正的RESTful方法。在这种情况下,我会说自定义POST
请求可能已经足够了。