我有一个实体,我需要在其中更改其状态以停用它。此停用过程也会触发其他相关实体的一系列操作(非cronjobs)。
我保留了此网址的API网址:
https://<base_url>/version/<entity_name>/<entity_id>/deactivate
这是我的问题:它应该是POST,PUT还是PATCH请求?
每个人的论点:
1)POST:http://restful-api-design.readthedocs.io/en/latest/methods.html#actions
2)补丁:因为我们正在改变这个实体和其他一些相关实体的某些属性。因此补丁。
3)PUT:我的一位同事说它应该是PUT。
答案 0 :(得分:1)
首先要明白的是POST ;我们一直在html表单中使用POST多年来,它完成了工作。
PUT和PATCH是用于将更改传递到远程系统的替代方法。想想远程创作;基本的想法是我的通用编辑工具发送 GET 来获取资源的当前表示,允许我对其进行更改,然后发回新的表示。
如果返回的表示是包含我的编辑的完整副本,那么我的创作工具应该使用PUT。如果返回的表示只是补丁,则创作工具应使用PATCH。
注意:我的创作工具是通用的;据它所知,它正在与文档商店交谈。因此,在定义API时,您的工作就是伪装成文档存储。
停用实体的实际工作是“文档商店”中集成资源操作的副作用。
因此,如果您愿意,实体的当前状态可以由文档表示,如果有人向您发回文档的副本,并将实体状态更改为“已停用”,那么您可以将其更改为实体。同样地,如果他们发送了一个PATCH,并且正文中的说明告诉您将第7行从激活更改为已停用,那么您可以执行相同的操作。
如果您符合RFC 7231中描述的POST和PUT以及RFC 5789中描述的PATCH的语义,则选择都是好的:PUT需要是幂等,PATCH需要是原子的,等等。