对于一直困扰我的事情,这更像是一个概念上的完整性问题。
HTTP的DELETE方法应该是幂等的,而REST的URI应该实际上代表事物。但似乎只在 reverse 方向定义:每个资源必须有一个URI,但给定的URI似乎不需要资源。更值得一提的是,我猜URI可以定义为指向空/空资源。
唯一真正相关的时间是DELETE请求。放在哪里最好的地方? example.com/users/
内容标识要删除的资源,或example.com/users/USERNAME
更好?
DELETE中的内容在HTTP和REST中似乎很好。 (从概念上讲:根据其他SO问题,各种框架会在处理DELETE请求之前默默地删除内容。)
所以这是我的想法:每个示例似乎都使用后一种方案 - 您在其 URI中删除资源,而不是从父集合中删除资源 URI - 但是成功删除后资源应该停止存在。在这种情况下,URI应该大声失败,imho。但这会否定DELETE的幂等性,导致我认为DELETE应该对集合进行操作,内容指定要删除的实际资源。
显然每个人都做了我不喜欢的事情,我应该为了我的用户的理智而配合它,但是在任何地方都可以清楚地说明这一点,或者显而易见的是我错过的东西让我错了?
答案 0 :(得分:4)
根据HTTP标准“DELETE方法请求源服务器删除Request-URI标识的资源”。 - 任何形式的请求机构都没有。
在这种情况下,URI应该大声失败,imho。但这会否定DELETE的幂等性
只返回404.幂等点的意思是,两次提交相同的DELETE请求不会导致服务器状态最终与提交一次不同。失败不会导致问题(除非服务器关闭或其他什么)
答案 1 :(得分:1)
DELETE
请求应仅适用于您要删除的资源的URI。要通过集合删除某些内容,该集合的POST
或PUT
会更合适。
您可以通过检查资源来实现对DELETE
请求的响应,如果存在则将其删除并返回2xx,否则只返回2xx(例如,在发送重复请求的情况下)。使该方法具有幂等性的观点是它不会“大声失败” - 它根本不被视为失败。就像PUT
无法区分“创建”和“更新”一样。