我正在努力学习如何正确设计休息服务。你如何处理非纯粹CRUD并需要复杂响应的事情?我的玩具示例是
通常的用例是在订单系统上提交订单并且必须告知库存系统更新。此更新是部分更新,因为只有在尝试更新时才能知道存在的库存数量。
由于库存系统不知道任何订单,因此无需更新主资源。
请求可能看起来像
PUT:库存/采取
或
补丁:库存
我认为PATCH可能是"正确的"选择是否遵循REST准则但是 如果我确实使用了PATCH,我可能应该修改JSON,使其更符合我阅读的操作。
JSON请求正文看起来像这样
[
{
productId: 1,
quantity: 2
}
{
productId: 10,
quantity: 3
}
]
这里的任何设计指导都将特别受到赞赏,特别是在现实世界中如何完成工作或任何有用的REST设计链接处理更复杂的事情然后CRUD将不胜感激。
答案 0 :(得分:1)
不确定问题到底是什么,但这里有几个答案要素:
PUT
是幂等的(或理论上应该是)。这意味着如果您将相同的请求两次PUT,它应该没有效果。显然情况并非如此,因为您在每次请求时都会减少数量,所以请忘记它。
您可以在资源PATCH
上使用POST
或/inventory
。您的JSON适用于PATCH
和POST
。这真的取决于你是否想要务实(然后使用POST
,它可以在任何地方工作)或理想主义(然后使用PATCH
,它很酷和语义)。
就我个人而言,我认为在将产品从库存中取出时发送负数量会更有意义,而在重新进货时会发送正数量。这样,您可以对两个操作使用相同的端点。
关于回复,我个人认为返回请求中传递的所有产品的列表以及更新的剩余数量是有意义的。例如:
[
{ productId: 1, remaining: 12 },
{ productId: 10, remaining: -1 }
]
返回与请求中相同的产品列表有很多优点:
remaining
中查找负值的行并忽略其余的行)