用于更新字段的RESTFul方法

用于更新字段的RESTFul方法,rest,restful-url,restful-architecture,Rest,Restful Url,Restful Architecture,我想知道,更新一个项目的字段(状态)的时,哪种方法更安静、更灵活、更好 /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/ + acti

我想知道,更新一个项目的字段(状态)的时,哪种方法更安静、更灵活、更好

/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}  

我更喜欢第三种API结构:

/api/v1/items/:id/ + action in the body
我的理由包括:

  • 根据URL应该指向一个特定的资源或一组资源。您不希望在URL中添加更新信息,因为它不符合有效端点的条件
  • 您希望将PUT用于影响资源的更新/替换操作。让URL选择资源,让正文定义要更新的确切字段,以及其他逻辑
  • 使用主体而不是查询字符串可以插入任意大的信息(达到一定的限制,但大于查询字符串),这些信息在逻辑上可能与操作配对(从您的案例开始)。它还允许在将来扩展操作时具有更大的灵活性
  • 您可能可以在
    /api/v1/items
    的响应中列出可以在端点上执行的相关操作。这将是一个信息超媒体控件列表。理查森成熟度模型再次提供了一个很好的例子

让我们重新表述这个问题: 如何更改资源的少数属性。(状态只是另一个属性)

答复:

识别资源

使用POST(因为请求是非幂等的) 在正文中提供,因为将来您可能需要更改此资源的更多属性,而不仅仅是状态

POST/api/v1/items/:id+体内的动作

仅使用POST方法

原因Put用于更改完整的属性集,而不是一个或部分属性

求你了,让我们继续。我们不需要对HTTP中的每个状态更改都使用PUT。REST从未说过我们应该这样做


作为替代方案,您可以实现补丁方法。它将为您提供更新选择性字段的可能性。补丁的唯一问题是它的未知性,因为RFC是年轻的。实际实现取决于服务器端和客户端库和框架


当您不想使用补丁时,唯一的替代方法是实现覆盖的POST并定义更新机制。例如,您可以说:每个字段!=null将覆盖资源字段值

HEAD方法与GET相同,只是服务器不能在响应中返回消息体。HEAD远未用于更新导致非幂等状态的单独更新。但put应用于创建。POST应用于创建,put用于更新。如果PUT针对的对象尚不存在,则返回
201 Created
;如果更新正常,则返回
200 OK
。查看“更改完整属性集而不是一个或部分属性时应使用Put”的来源?我根本没有在HTTP规范中读到这一点。哦,请将这个答案合并到原始问题中!