我有一些项目集合,其中一些可能会删除,也可能不会删除,具体取决于一些先决条件。如果用户想要删除资源(DELETE /collection/1
)并且该资源存在外部依赖性,则服务器将返回错误。但是如果用户想要删除整个集合(DELETE /collection
)?
是否应该删除所有可以删除的资源并且服务器返回2xx,或者服务器是否应保留所有内容并返回4xx?这是预期的行为?
答案 0 :(得分:3)
作为REST API使用者,我希望该操作是原子操作,如果其中一个删除失败,可能会返回409 Conflict
详细信息。另外,DELETE方法在理论上是幂等的,正如@jbarrueta指出的那样。
现在,如果不可删除的资源是您的用例中的正常事件并经常发生,您可能希望稍微偏离规范,删除所有可删除的内容并返回类似206 Partial Content
(don'的内容但是要知道这对DELETE来说是否合法,并且有关未删除资源的详细信息。
但是,如果您需要精确管理错误情况,最好发送单独的DELETE命令。
答案 1 :(得分:1)
我认为正确的结果是204没有成功的内容,409因为依赖而失败(正如其他人指出的那样)。我也支持原子性。
我认为您将REST视为SOAP / RPC,但显然不是。您的REST服务必须满足统一接口约束,其中包括HATEOAS接口约束,因此您必须向客户端发送超链接。
如果我们谈论的是一个简单的链接,例如DELETE /collection
,那么只有当它所代表的资源状态转换可以从当前资源状态获得时,您必须将链接发送到客户端。因此,如果由于依赖性而无法删除集合,那么您就不会发送有关此转换的链接,因为这是不可能的。
如果是模板化链接,则必须附加"可移除的"属性到项目,如果为false,则将复选框设置为禁用。
这种方式只有当客户端从先前(陈旧)资源状态的表示中获取链接时才会发生冲突,在这种情况下,您必须通过使用GET再次查询服务器来更新客户端状态。
答案 2 :(得分:0)
我说这取决于您的域名(虽然我宁愿使用DELETE /collection/all
代替DELETE/collection/
),
如果你有使用删除的情况,但有些项目无法删除,那么这取决于你的域名,如果你正在进行全部删除以释放资源,如果不是你的业务流程受到影响,那么删除可删除的内容并将其他内容放入重试队列是有意义的。在那种情况下,响应应该没问题。
也可能出现可能有两个操作的情况
在任何一种情况下,我宁愿使用特定方法,而不是在根网址上使用DELETE
,
清理 - DELETE /collection/unused
删除所有内容 - DELETE /collection/all