REST中的R代表资源
(这是不正确的,因为它代表表示形式,但这是记住资源在REST中的重要性的好技巧)。
关于PUT /groups/api/v1/groups/{group id}/status/activate
:您不更新“激活”。“激活”不是事物,而是动词。动词永远不是好的资源。经验法则:如果动作(动词)在URL中,则可能不是RESTful的。
你在做什么呢?您正在“添加”,“删除”或“更新” 组上的激活,或者如果您愿意:在组上操作“状态”资源。就个人而言,我会使用“激活”,因为它们比“状态”的概念不那么模棱两可:创建状态是模棱两可的,而创建激活则不是。
POST /groups/{group id}/activation
创建(或请求创建)激活。
PATCH /groups/{group id}/activation
更新现有激活的一些详细信息。由于一个组只有一个激活,因此我们知道我们指的是什么激活资源。
PUT /groups/{group id}/activation
插入或替换旧的激活。由于一个组只有一个激活,因此我们知道我们指的是什么激活资源。
DELETE /groups/{group id}/activation
将取消或删除激活。
当组的“激活”具有副作用(例如付款,发送邮件等)时,此模式很有用。只有POST和PATCH可能会有这种副作用。例如,当需要删除激活信息时,例如通过邮件通知用户,DELETE不是正确的选择。在这种情况下,你可能想创建一个停用的资源:POST /groups/{group_id}/deactivation
。
遵循这些准则是个好主意,因为此标准合同对您的客户以及客户与您之间的所有代理和层非常清楚,知道什么时候可以重试,什么时候不可以。假设客户端位于不稳定的wifi上,并且用户单击“停用”,这会触发DELETE
:如果失败,则客户端可以简单地重试,直到获得404、200或它可以处理的其他任何功能。但是,如果触发了POST to deactivation
它,它就知道不重试:POST暗示了这一点。
现在,任何客户端都有合同,遵循该合同,可以防止发送42封“您的组已被停用”的电子邮件,这仅仅是因为其HTTP库不断重试对后端的调用。
更新单个属性:使用PATCH
PATCH /groups/{group id}
如果您希望更新属性。例如,“状态”可以是可以设置的网上论坛的属性。诸如“状态”之类的属性通常是将值限制为白名单的理想选择。示例使用一些未定义的JSON方案:
PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK
PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable
替换资源时,没有副作用,请使用PUT。
PUT /groups/{group id}
如果您希望更换整个组。这并不一定意味着服务器实际上会创建一个新组并将旧组扔掉,例如,id可能保持不变。但对于客户来说,这是什么PUT 可意味着:客户应承担他得到了一个全新的项目,基于服务器的响应。
如果有PUT
请求,客户端应该始终发送整个资源,并拥有创建新项目所需的所有数据:通常与POST创建所需的数据相同。
PUT /groups/{group id} { "attributes": { "status": "active" } }
response: 406 Not Acceptable
PUT /groups/{group id} { "attributes": { "name": .... etc. "status": "active" } }
response: 201 Created or 200 OK, depending on whether we made a new one.
一个非常重要的要求是PUT
幂等的:如果在更新组(或更改激活)时需要副作用,则应使用PATCH
。因此,当更新导致例如发送邮件时,请不要使用PUT
。