支持数据服务的取消删除或延迟/批处理删除是相当常见的要求。我想知道的是如何以REST方式实现这一点。我在几个不同的选择之间撕裂(其中没有一个对我来说似乎非常有吸引力)。我相信,在这些不同的选项中,通常需要一个API,它将返回标记为特定资源类型已删除的所有资源。REST风格取消删除
这里是我想过和他们的一些优点/缺点的一些选项:
为删除选项来标记资源:
- 使用HTTP DELETE来标记资源为已删除。
- 使用HTTP PUT/POST更新已删除的标志。这并不正确,因为它将本质上是从HTTP DELETE方法中删除的内容映射到其他HTTP方法中。
选项时GET-ING资源标记为删除:
- 返回HTTP状态404资源被标记为删除。清除&透明,但我们如何区分真正删除的资源与刚刚标记为已删除的资源之间的区别。
- 返回HTTP状态410.提供方式来说明不同之处,但从技术上说410“预计被认为是永久性的。具有链接编辑功能的客户应该在用户批准后删除对Request-URI的引用。这里的“预计”和“应该”可能有足够的摆动空间。不确定410在客户中的支持/理解程度如何。
- 返回HTTP状态200并且包括标志字段指示资源被删除。这看起来很奇怪,因为首先删除它的想法是因为你真的希望它不出现。这推动了将已删除资源过滤到客户端的责任。为响应,其中包括该删除资源
选项:
- 忽略makred为已删除的资源。清洁&简单。但是如果你真的想知道被删除的资源呢。
- 将它们与指示它们被删除的字段一起包括在内。这推动了将已删除资源过滤到客户端的责任。如果您只想通过活动或已删除的资源进行分页,分页会变得非常棘手。
选项时更新资源标记为删除:
- 使用HTTP状态404资源没有了吧?但是,您如何能够区分标记为已删除的资源和实际删除的资源。 404响应中的HTTP主体可能会在此消除歧义,但客户端仍然会解析/解释您的身体以消除歧义。也许响应标题可能有帮助吗?哪一个?自定义标题?
- 使用HTTP状态409,提供有关资源如何首先被取消删除的消息。
选项取消删除资源标记为删除:对资源的更新操作
- 使用HTTP PUT/POST,并再次将其标记为活动。只有当您没有为资源的GET操作返回HTTP 404时,它才会起作用,因为它不会因为PUT/POST而导致资源为“未找到”(404)。
- 使用HTTP PUT/POST进行资源的创建操作。这里的问题是哪些数据优先?在创建操作中发送的数据?或者正在取消删除的数据?将其过滤出任何其他将会返回它的查询。然后,如果资源标识符指向标记为已删除的资源,则将创建资源的HTTP PUT/POST视为取消删除。
- 单独的REST路径专用于标记为删除的取消删除资源。
这绝不是一个详尽的清单。我只想列举一些在我脑海中弹跳的选项。
我知道如何做到这一点的答案是,像往常一样,“这取决于”。我很好奇的是你会用什么资格/要求做出决定?你怎么看到这个实现或自己实现它?
这是迄今为止我在StackOverflow上见过的最充分准备和深思熟虑的问题之一。有一个upvote。 – 2014-05-16 19:23:46