【问题标题】:REST API - DELETE with list of IDs [closed]REST API - 使用 ID 列表删除 [关闭]
【发布时间】:2020-07-14 12:32:31
【问题描述】:

我想从数据库中删除保护。为此,我需要将列表 pf ID 和一些标志 removeBackup = true/false 传递给后端。

我应该将DELETE 与请求正文一起使用,还是将ID 列表(UUID 类型,因此这些ID 很长)作为查询参数并附加标志作为查询参数?

最好的选择是 POST 但我想删除一些记录...

【问题讨论】:

标签: spring-boot rest http


【解决方案1】:

我应该使用 DELETE

没有。

DELETE 的语义由RFC 7231 section-4.3.5 定义。

注意这个观察:

相对较少的资源允许使用 DELETE 方法——它的主要用途是远程创作环境,用户对其效果有一定的指导。

删除transporting documents over a network域的语义;这不是您想要的 - 您尝试执行的副作用的语义特定于 您的 域。

我应该在请求正文中使用 DELETE

否,因为 DELETE 消息的有效负载没有定义的语义。 (在实践中:如果您对客户端运行的环境有足够的控制权,那么您也许可以侥幸逃脱。这是一个错误,但不一定是会导致失败的错误。)

附加 ID 列表...作为查询参数

这个你可以做,但是有点牵强。

从机械上讲,它是完全直截了当的;您可以轻松地在 URI template 中描述查询参数列表,它充当 Web 表单的一种概括。您当然可以使用构造的 URI 发送 DELETE 请求——毕竟,统一接口的重点是所有资源都以相同的方式理解 HTTP 方法标记。

此外,DELETE 的语义是幂等的,这是一个很好的胜利:如果对 DELETE 请求的响应丢失,我们可以重新发送请求,因为知道服务器会理解请求的第二个副本不会'不要改变意思。

但这有点 RPC;从某种意义上说,我们真正做的是向服务器发送一个描述我们想做的工作的文档,但是我们不是将工作描述放入文档中,而是将工作描述放入 URI .

这里更好的选择是承认我们不是要删除文档,而是将文档传送到 Web 服务器,以便它可以读取其中的说明并做一些有用的事情。 DELETE 不是用于这种情况的正确方法标记。

最好的选择是 POST 但我想删除一些记录...

It is okay to use POST。请记住,万维网在其首选的超文本媒体类型 (HTML) 中仅使用 GET 和 POST 就取得了灾难性的成功。

PUT 在这里也是一个合理的选择。您需要以不同的方式来考虑文档,但结果是 PUT 与 DELETE 一样具有幂等语义。

稍有不同:考虑将(一份)问题单发送到您的数据库管理员的收件箱。文档是对您想要的工作的描述,HTTP 语义描述文档的传输,对数据库所做的更改是文档成功交付的副作用

【讨论】:

  • 优秀的答案,谢谢:) 我认为 POST 在我的情况下是不错的选择
【解决方案2】:

如果您打算删除多个项目,从技术上讲,您正在执行以下两件事之一。

  1. 您正在删除父资源的项目:在这种情况下,您可以使用父资源的 PUT(或 PATCH 取决于您的选择)

  2. 不遵循 REST 语义:我们的所有用例不一定都适合 REST 风格,有时我们可能需要偏离 REST 风格。例如。批量更新,我们正在处理的资源的性能/安全方面等。在您的情况下,您正在尝试执行批处理。这在更多 API 发布者中是很常见的用例。事实上,amazon、google 等都支持批处理 api,主要是在 POST 中完成。由于在 REST 中没有定义,我们可以选择我们认为更好的方式。以下是您可以使用批处理脚本执行的一些方法。

    • 使用 POST(我更喜欢这种方式)
    • 使用 DELETE,但在某些自定义标头中发送 id
    • 如果存在父 ID,则使用 PUT/PATCH

无论您使用什么,请确保为您的客户正确记录它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2015-03-18
    相关资源
    最近更新 更多