REST批量删除多个项目

2023-12-30

我需要按批处理中的 id 删除多个项目,但是 HTTP DELETE 不支持正文有效负载。

解决方案:

1. @DELETE /path/abc?itemId=1&itemId=2&itemId=3 on the server side it will be parsed as List of ids and DELETE operation will be performed on each item.

2. @POST /path/abc including JSON payload containing all ids. { ids: [1, 2, 3] }

这有多糟糕?哪个选项更好?还有其他选择吗?

Update:请注意,性能是这里的关键,它不是为每个单独的 id 执行删除操作的选项。


多年来,许多人对此表示怀疑,正如我们在此处的相关问题中看到的那样。似乎接受的答案范围从“一定会这样做" to "它明显滥用了协议由于很多问题都是几年前发出的,所以让我们从 2014 年 6 月开始深入研究 HTTP 1.1 规范(RFC 7231 https://www.rfc-editor.org/rfc/rfc7231),以便更好地了解明确不鼓励或不鼓励的内容。

第一个建议的解决方法:

首先,关于资源和 URI 本身第2节 https://www.rfc-editor.org/rfc/rfc7231#section-2:

HTTP 请求的目标称为“资源”。 HTTP 不限制资源的性质;它仅仅定义了一个可用于与资源交互的接口。每个资源都由统一资源标识符 (URI) 标识。

基于此,有些人可能会争辩说,由于 HTTP 不限制资源的性质,因此包含多个资源的 URIid将是可能的。我个人认为这是一个解释问题。

关于您提出的第一个解决方法(DELETE '/path/abc?itemId=1&itemId=2&itemId=3')我们可以得出这样的结论:如果您将资源视为实体集合中的单个文档,那么这是令人沮丧的事情,而如果您将资源视为实体集合本身,则可以很好地进行。

第二个建议的解决方法:

关于您提出的第二个解决方法(POST '/path/abc' with body: { ids: [1, 2, 3] }), 使用POST删除方法可能会产生误导。这部分第 4.3.3 节 https://www.rfc-editor.org/rfc/rfc7231#section-4.3.3说关于POST:

POST 方法请求目标资源根据资源自身的特定语义处理请求中包含的表示。例如,POST 用于以下功能(除其他外): 向数据处理过程提供数据块,例如输入到 HTML 表单中的字段;将消息发布到公告板、新闻组、邮件列表、博客或类似的文章组;创建尚未被源服务器识别的新资源;将数据附加到资源的现有表示。

虽然对于“除其他外”的功能有一些解释空间POST,它显然与我们有该方法的事实相冲突DELETE用于资源移除,正如我们所见第 4.1 节 https://www.rfc-editor.org/rfc/rfc7231#section-4.1:

DELETE 方法删除目标资源的所有当前表示。

所以我个人强烈反对使用POST删除资源。

另一种解决方法:

受到您的第二种解决方法的启发,我们建议另一种解决方法:

DELETE '/path/abc' with body: { ids: [1, 2, 3] }

它与解决方法二中建议的几乎相同,但使用正确的 HTTP 方法进行删除。在这里,我们遇到了使用实体的困惑body in a DELETE要求。有很多人说它无效,但我们还是坚持一下吧第 4.3.5 节 https://www.rfc-editor.org/rfc/rfc7231#section-4.3.5规格:

DELETE 请求消息中的有效负载没有定义的语义;在 DELETE 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。

因此,我们可以得出结论,该规范不会阻止DELETE从有一个body有效负载。不幸的是,一些现有的实现可能会拒绝该请求......但这对我们今天有何影响?

很难百分百确定,但现代的要求是fetch只是不允许body for GET and HEAD。这就是什么获取标准 https://fetch.spec.whatwg.org/状态于第 5.3 节 https://fetch.spec.whatwg.org/#request-class关于第 34 项:

如果 body 存在且非 null 或 inputBody 非 null,并且请求的方法是 GET 或 HEAD,则抛出 TypeError。

我们可以确认它是以相同的方式实现的获取polyfill https://github.com/github/fetch at line 342 https://github.com/github/fetch/blob/3674c98df696d45573750aa7873814887d25689a/fetch.js#L342.

最后的想法:

由于替代解决方法是DELETE and a bodyHTTP 规范允许有效负载可行,并且所有现代浏览器都支持fetch从 IE10 开始,我建议使用这种方式以有效且完整的工作方式进行批量删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

REST批量删除多个项目 的相关文章

随机推荐

  • 使用 Qt Creator 时的 CMake 配置问题

    我正在尝试使用 cmake 在 qt Creator 中设置构建环境 但无论我尝试什么 我都无法让它取得进展 它因问题而失败 配置问题 当展开一般消息部分中的详细信息时 它看起来像是无法编译测试 C 程序 我看不出我的 qt 创建者配置有什
  • Java:如何获取OS X Lion中的滚动方法?

    由于 OS X 支持 自然滚动 因此我的应用程序无法正常工作 自然滚动是为滚动窗格设计的 我真的很喜欢 但是 当我想放大 缩小时 它会出错 所以 我想做的是检查 OS X 的滚动方法 如果它是 自然的 我将采用与滚动值相反的值MouseWh
  • 如何在Numpy中实现ReLU函数

    我想制作一个使用 ReLU 函数的简单神经网络 有人可以告诉我如何使用 numpy 实现该函数吗 有几种方法 gt gt gt x np random random 3 2 0 5 gt gt gt x array 0 00590765 0
  • 如何在 EditText 中嵌入视图(带有按钮等)?

    我正在尝试找出如何嵌入东西 other与 Drawables 相比 在 EditText 小部件内 具体来说 我想到的例子来自 Google Buzz 小部件 截屏 http greydream org pics buzz png 没有内嵌
  • Google Apps 域上的 Google App Engine

    我无法将我的域名指向由 Google 应用引擎托管的网站 这是背景 注意区分 谷歌应用程序 域名托管 电子邮件等 和 谷歌应用程序引擎 网站框架 的概念 我有一个正在使用 Google Apps for Your Domain 的域 我们将
  • 在 XQuery 中搜索两个图节点之间的路径

    我正在尝试创建一种算法 用于搜索并返回 xQuery 中图形中两个节点之间的路径 但到目前为止我没有运气 因为它只返回一个节点及其相邻节点 首先 我应该明确该图是一个有向图 每个节点可以有零个 一个或多个原点 在 XML 中 节点仅具有到其
  • 如何使用 SSL 在 RHEL 上编译 python3?无法导入 SSL

    我正在尝试在 RHEL 上编译 python 因为我当前的 python 使用的是旧的 1 0 2k ssl 版本 test env brad reason tlscheck python3 version Python 3 9 3 tes
  • 带有 Linq Select 的 Expression> - CS1929 List 不包含“Select”的定义和最佳扩展方法

    我收到以下错误 但无法解决 CS1929 List
  • 将instanceof与类Object一起使用[重复]

    这个问题在这里已经有答案了 使这项工作正常进行的正确语法是什么 public boolean isTypeOf Class type return this instanceof type 我打算这样称呼它 foo isTypeOf MyC
  • 什么是以“t”开头的值以及如何在计数时忽略它们

    我正在尝试查询某些属性的频率Wikidata https query wikidata org 使用 SPARQL 例如 为了找出性别不同值的频率是多少 我有以下查询 SELECT rid COUNT rid AS count WHERE
  • 获取 127.0.1.1 而不是 192.168.1.* ip ubuntu python

    我是Python新手 我想获取系统的IP地址 我是在局域网中连接的 当我使用下面的代码获取IP时 它显示127 0 1 1而不是192 168 1 32 为什么不显示 LAN ip 那我怎样才能得到我的LAN ip呢 每个教程都只展示这种方
  • 使用 FileStream 创建文件会返回 InvalidOperationException

    它返回exception特别是在line 12 public void saveToXML URL newURL new URL newURL type type newURL name name newURL info info newU
  • Reactor 项目和 Java 内存模型

    我试图了解 Projectreactor 为应用程序代码提供的数据可见性方面的保证 例如我预计下面的代码会失败 但经过一百万次迭代后它不会失败 我正在更改线程 A 上典型 POJO 的状态 并从线程 B 读回它 Reactor 是否保证 P
  • 想要在本机反应中自动滚动平面列表

    我正在尝试自动滚动我的平面列表 但是当我运行代码时 我无法自动滚动 如果我想手动滚动 它会在每 5 秒后到达索引 0 这是我的平面列表及其 refs 函数的所有代码 在构造函数中 this flatList1 null 并在 compone
  • 在 webpack 构建中包含 git commit 哈希值和日期

    我正在使用react es6 webpack 我想在我的应用程序中的某处显示构建日期和 git 哈希值 最好的方法是什么 你可以使用 webpack 的定义插件 https webpack js org plugins define plu
  • WPF 文本块 TargetNullValue 不起作用?

    我有一个 wpf 文本块 如下所示
  • GOTO 仍然被视为有害吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每个人都知道迪杰斯特拉 Dijkstra 给编辑的信 转到被认为有害的声明 http portal acm org citation cfm d
  • 有没有免费的lib访问html5数据库SQLite?

    该库应该易于使用来访问 html5 本地存储 sqlite 就像定义表 添加 更新 删除实体 从数据库查询实体一样 可能使用该库我可以编写如下代码 code var db new MyDataBase var users db Users
  • 为什么一个能工作,一个崩溃?

    这已经让我抓狂了一个多星期了 下面是游戏中机器人玩家的两段 Lua 代码片段比特战士 http bitfighter org 用 C 编写 使用 LuaWrapper 的变体进行绑定 当我第一次启动 Lua 脚本时 两者都完全按预期工作 但
  • REST批量删除多个项目

    我需要按批处理中的 id 删除多个项目 但是 HTTP DELETE 不支持正文有效负载 解决方案 1 DELETE path abc itemId 1 itemId 2 itemId 3 on the server side it wil