如果某些项目无法删除,DELETE / collection应该怎么办?

时间:2015-05-15 00:34:35

标签: rest design-patterns

我有一些项目集合,其中一些可能会删除,也可能不会删除,具体取决于一些先决条件。如果用户想要删除资源(DELETE /collection/1)并且该资源存在外部依赖性,则服务器将返回错误。但是如果用户想要删除整个集合(DELETE /collection)?

会发生什么

是否应该删除所有可以删除的资源并且服务器返回2xx,或者服务器是否应保留所有内容并返回4xx?这是预期的行为?

3 个答案:

答案 0 :(得分:3)

作为REST API使用者,我希望该操作是原子操作,如果其中一个删除失败,可能会返回409 Conflict详细信息。另外,DELETE方法在理论上是幂等的,正如@jbarrueta指出的那样。

现在,如果不可删除的资源是您的用例中的正常事件并经常发生,您可能希望稍微偏离规范,删除所有可删除的内容并返回类似206 Partial Content(don'的内容但是要知道这对DELETE来说是否合法,并且有关未删除资源的详细信息。

但是,如果您需要精确管理错误情况,最好发送单独的DELETE命令。

答案 1 :(得分:1)

我认为正确的结果是204没有成功的内容,409因为依赖而失败(正如其他人指出的那样)。我也支持原子性。

我认为您将REST视为SOAP / RPC,但显然不是。您的REST服务必须满足统一接口约束,其中包括HATEOAS接口约束,因此您必须向客户端发送超链接。

  1. 如果我们谈论的是一个简单的链接,例如DELETE /collection,那么只有当它所代表的资源状态转换可以从当前资源状态获得时,您必须将链接发送到客户端。因此,如果由于依赖性而无法删除集合,那么您就不会发送有关此转换的链接,因为这是不可能的。

  2. 如果是模板化链接,则必须附加"可移除的"属性到项目,如果为false,则将复选框设置为禁用。

  3. 这种方式只有当客户端从先前(陈旧)资源状态的表示中获取链接时才会发生冲突,在这种情况下,您必须通过使用GET再次查询服务器来更新客户端状态。

    1. 另一种可能的解决方案(ofc。结合之前的解决方案)来显示链接并自动删除依赖关系。
    2. 我猜你可以使用PATCH进行批量更新,其中包括批量删除,因此这也可以是另一种解决方案。

答案 2 :(得分:0)

我说这取决于您的域名(虽然我宁愿使用DELETE /collection/all代替DELETE/collection/),

如果你有使用删除的情况,但有些项目无法删除,那么这取决于你的域名,如果你正在进行全部删除以释放资源,如果不是你的业务流程受到影响,那么删除可删除的内容并将其他内容放入重试队列是有意义的。在那种情况下,响应应该没问题。

也可能出现可能有两个操作的情况

  1. 清理 - 仅删除未使用的
  2. 全部删除 - 全部删除
  3. 在任何一种情况下,我宁愿使用特定方法,而不是在根网址上使用DELETE

    清理 - DELETE /collection/unused

    删除所有内容 - DELETE /collection/all