【发布时间】:2020-07-14 12:32:31
【问题描述】:
我想从数据库中删除保护。为此,我需要将列表 pf ID 和一些标志 removeBackup = true/false 传递给后端。
我应该将DELETE 与请求正文一起使用,还是将ID 列表(UUID 类型,因此这些ID 很长)作为查询参数并附加标志作为查询参数?
最好的选择是 POST 但我想删除一些记录...
【问题讨论】:
标签: spring-boot rest http
我想从数据库中删除保护。为此,我需要将列表 pf ID 和一些标志 removeBackup = true/false 传递给后端。
我应该将DELETE 与请求正文一起使用,还是将ID 列表(UUID 类型,因此这些ID 很长)作为查询参数并附加标志作为查询参数?
最好的选择是 POST 但我想删除一些记录...
【问题讨论】:
标签: spring-boot rest http
我应该使用 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 语义描述文档的传输,对数据库所做的更改是文档成功交付的副作用。
【讨论】:
如果您打算删除多个项目,从技术上讲,您正在执行以下两件事之一。
您正在删除父资源的项目:在这种情况下,您可以使用父资源的 PUT(或 PATCH 取决于您的选择)
不遵循 REST 语义:我们的所有用例不一定都适合 REST 风格,有时我们可能需要偏离 REST 风格。例如。批量更新,我们正在处理的资源的性能/安全方面等。在您的情况下,您正在尝试执行批处理。这在更多 API 发布者中是很常见的用例。事实上,amazon、google 等都支持批处理 api,主要是在 POST 中完成。由于在 REST 中没有定义,我们可以选择我们认为更好的方式。以下是您可以使用批处理脚本执行的一些方法。
无论您使用什么,请确保为您的客户正确记录它。
【讨论】: