我有一天想着这个问题,我试图从RESTful Web服务食谱和其他stackoverflow帖子中进行一些阅读,但是仍然没有令人信服的答案:
假设我有一个存储两个用户之间关系的数据库表,该关系表示如果用户A在关注用户B(例如,在Instagram / Twitter上)。
userId|userId
------|------
userA | userB
userA | userC
....
现在,如果用户A要取消关注,那么该API应该是DELETE
还是POST
?
在RESTful Web服务指南第11页中,它说:
“ DELETE
方法是幂等的。这意味着即使服务器删除了先前请求中的资源,服务器也必须返回响应代码200(确定)。但是实际上,实现{{1 }}作为幂等操作需要服务器跟踪所有已删除的资源。否则,它可以返回 404 (未找到)。”
这是否表明我们在可以避免的情况下不要使用DELETE
?
感谢您对此问题的任何见解!
答案 0 :(得分:2)
DELETE
用于删除特定资源。因此,DELETE
是否适合您取决于您是否拥有一个“代表”两个用户之间关注关系的资源。
例如,如果您有这样的资源:
/api/userA/follows/userB
那么可以说这个资源代表了两者之间的关系。它具有唯一的url,因此可以删除该url。
答案 1 :(得分:2)
DELETE
建立在Evert's answer之上,可以满足您的需求,只要您拥有代表两个用户之间关系的资源即可。
DELETE
方法的语义在RFC 7231中定义:
DELETE
方法请求原始服务器删除目标资源与其当前功能之间的关联。 [...]
DELETE
方法实际上是幂等的,但是当您将幂等与状态代码相关联时,您的报价根本上是错误的。
正如我在此answer中先前提到的那样,幂等性与状态码本身无关。幂等性是关于在服务器上资源状态上产生的效果,即使后续请求的响应与第一个请求的响应不同。
请考虑客户端执行DELETE
请求以从服务器中删除资源。服务器处理请求,资源被删除,服务器返回204
。然后客户端重复相同的DELETE
请求,并且由于资源已被删除,服务器返回404
,这完全可以。
尽管客户端收到的状态码不同,但单个DELETE
请求产生的效果与针对同一URI的多个DELETE
请求的效果相同。< / p>