用于更新字段的RESTFul方法

时间:2013-10-01 04:39:27

标签: rest restful-url restful-architecture

我想知道,更新(!)项目的字段(状态)的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}  

3 个答案:

答案 0 :(得分:5)

我更喜欢第三种API结构:

/api/v1/items/:id/ + action in the body

我的理由包括:

  • 根据Richardson Maturity Model,URL应指向特定资源或资源集。您不希望在URL中添加更新信息,因为它不符合有效端点的条件。
  • 您希望将PUT用于影响资源的更新/替换操作。让URL选择资源,让主体定义您想要更新的确切字段,否则定义任何其他逻辑。
  • 使用正文而不是查询字符串允许您插入任意大的信息(达到某个限制,但大于查询字符串),逻辑上可能与操作配对(从您的情况开始)。它还可以在未来扩展操作方面提供更大的灵活性。
  • 您可以在/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