支持撤销删除或延迟/批量删除对于数据服务来说是一个相当常见的需求。我想知道的是如何以RESTful的方式实现这一点。我在几种不同的选项之间犹豫(其中没有一种对我来说特别有吸引力)。我认为这些不同选项中的共同点是需要一个API,该API返回特定资源类型标记为已删除的所有资源。
以下是我考虑过的一些选项及其优缺点:
将资源标记为已删除的选项:
- 使用HTTP DELETE将资源标记为已删除。
- 使用HTTP PUT / POST更新已删除标志。这不太对,因为它将本质上是删除的内容从HTTP DELETE方法映射到其他HTTP方法中。
获取已标记为删除的资源时的选项:
- 为标记为已删除的资源返回HTTP状态404。干净透明,但我们如何区分真正删除的资源和仅标记为删除的资源。
- 返回HTTP状态410。提供了区分它们的方法,但410技术上表示“预计应被视为永久性。具有链接编辑功能的客户端应在用户批准后删除对请求URI的引用。”这里的“预计”和“应”这两个词可能有足够的空间。不确定客户端中有多少支持/了解410。
- 返回HTTP状态200并包括指示资源已删除的标志字段。这似乎很奇怪,因为首先要删除它的想法是因为您实际上希望它不出现。这将责任推给客户端过滤已删除的资源。
包含此已删除资源的响应选项:
- 省略标记为已删除的资源。清洁简单。但是如果您确实想知道有关已删除资源的信息呢?
- 将它们与指示它们已被删除的字段一起包含在内。这将责任推向客户端过滤已删除的资源。如果您只想分页浏览活动或已删除的资源,则分页变得棘手。
更新已标记为删除的资源时的选项:
- 使用HTTP状态码404。该资源已经消失,对吧?但是,你如何区分一个被标记为删除的资源和一个实际上被删除的资源之间的区别。 404响应中的HTTP正文可能有助于消除歧义,但是客户端需要解析/解释正文以消除歧义。也许响应头可以在这里提供帮助?哪一个?自定义标头?
- 使用HTTP状态码409,并说明资源必须首先取消删除。
- 使用HTTP PUT / POST进行资源的更新操作并将其标记为活动状态。只要您不返回HTTP 404来获取资源的GET操作,此方法才有效,因为将PUT / POST用于“未找到”(404)的资源是没有意义的。
- 使用HTTP PUT / POST进行资源的创建操作。问题在于哪些数据优先?在创建操作中发送的数据?还是正在取消删除的数据?从任何其他会返回它的查询中过滤掉它,然后,如果资源标识符指向标记为已删除的资源,则将创建资源的HTTP PUT / POST视为取消删除。
- 专门用于取消删除已标记删除资源的REST路径。
取消删除已标记删除资源的选项:
这绝非详尽无遗的列表。我只想罗列一些在我的脑海中反复出现的选项。
我知道如何做这件事的答案通常是“取决于情况”。我感兴趣的是,您将使用什么资格/要求来做出决定?您如何看待它的实施或自己实施了它?