DELETE /collection 如果有些item删除不了怎么办?

What should DELETE /collection do if some items can't be deleted?

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

是应该把能删除的资源全部删除,服务器return一个2xx,还是服务器原封不动,return一个4xx?哪种行为是预期的行为?

我会说这取决于您的域(尽管我宁愿使用 DELETE /collection/all 而不是 DELETE/collection/),

当您遇到使用 delete all 但某些项目无法删除的情况时,这取决于您的域,如果您正在执行 delete all 以释放资源,如果不是您的业务流程会受到影响,那么最好删除可以删除的内容并将其他内容放入重试队列中才有意义。在那种情况下,响应应该没问题。

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

  1. 清理 - 仅删除未使用的
  2. 全部删除 - 全部删除

在任何一种情况下,我都宁愿使用特定的方法,而不是在根 URL、

上使用 DELETE

用于清理 - DELETE /collection/unused

用于删除所有 - DELETE /collection/all

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

现在,如果不可删除的资源在您的用例中是一个正常事件并且经常发生,您可能想要稍微偏离常态,删除所有可以删除的,return 像 206 Partial Content(虽然不知道这对 DELETE 是否合法)关于未删除资源的详细信息。

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

我认为正确的结果是 204 no content by success 和 409 conflict by failure 因为依赖关系(正如其他人指出的那样)。我也支持原子性。

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

  1. 如果我们谈论的是一个简单的link,比如DELETE /collection,那么你必须将link发送给客户端,只有在资源状态转换时它表示,可从当前资源状态获得。因此,如果您因为依赖关系而无法删除集合,那么您不会发送关于此转换的 link,因为这是不可能的。

  2. 如果它是模板化的 link,那么您必须将 "removable" 属性 附加到项目,如果是,则将复选框设置为禁用假的。

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

  1. 显示 link 并自动删除依赖项的另一种可能的解决方案(ofc。与之前的解决方案结合使用)。
  2. 我猜你可以使用 PATCH 进行批量更新,包括批量删除,所以这也是另一种解决方案。