我想知道,更新(!)项目的字段(状态)的RESTFul,灵活且更好的方法是什么
/api/v1/items/:id?action=start
/api/v1/items/:id/start
/api/v1/items/:id/ + action in the body
/api/v1/items/:id/status/{active|stopped}
或项目
/api/v1/items?action=start
/api/v1/items/start
/api/v1/items/ + action in the body
/api/v1/items/status/{active|stopped}
答案 0 :(得分:5)
我更喜欢第三种API结构:
/api/v1/items/:id/ + action in the body
我的理由包括:
/api/v1/items
的响应中列出可以在端点上执行的相关操作。这将是一个信息丰富的超媒体控件列表。同样,Richardson成熟度模型提供了一个非常好的例子。答案 1 :(得分:1)
作为替代方案,您可以实现PATCH方法。它将为您提供更新选择性字段的可能性。 PATCH的唯一问题是它的未知因为RFC很年轻。实际的实现取决于您的服务器和客户端库和框架。
当您不想使用PATCH时,唯一的选择是实现重写POST并定义更新机制。例如,您可以说:每个字段!= null将覆盖资源字段值。
答案 2 :(得分:0)
让我们重新提问: 我该如何更改资源的少数属性。 (状态只是另一个属性)
答案:
识别资源。
使用POST(因为请求是非幂等的) 在体内供应,因为将来您可能需要更改更多属性而不仅仅是此资源的状态。
POST / api / v1 / items /:身体中的id +动作
仅使用 POST 方法。
<强>原因强>: 当更改完整的属性集而不是一个或部分属性时,应使用 Put 。
拜托,让我们继续吧。我们不需要为HTTP中的每个状态更改使用PUT。 REST从未说过我们应该这样做。 It is okay to use POST - roy t fielding