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批量删除多个项目 的相关文章

  • Spring/Rest @PathVariable 字符编码

    在我使用的环境 Tomcat 6 中 路径段中的百分比序列在映射到 PathVariable 时显然是使用 ISO 8859 1 进行解码的 我希望它是 UTF 8 我已经将 Tomcat 配置为使用 UTF 8 使用 server xml
  • 寻找在 Ruby on Rails 中构建安全 REST API 的建议

    我正开始为我正在从事的项目构建 REST API 这促使我对使用 RoR 构建 API 的最佳方法进行了一些研究 我很快发现 默认情况下 模型是向世界开放的 只需在 URL 末尾添加 xml 并传递适当的参数即可通过 URL 进行调用 那么
  • 如何从 Android 应用程序调用 REST API? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 android 新手 也是编程新手 如何从 Android 应用程序调用 REST api GET POST 请求 请给我推荐一
  • 如何使用 Hibernate 解决错误“由于启用了‘集合获取分页失败’而失败”?

    我正在尝试使用 Spring Data 查询数据库中表 Product 的前 5 个元素 然后是接下来的 5 个元素等 Pageable 但是我的表 产品 包含与另一个名为 公司 的表的关系 所以我需要做一个join fetch也可以获取公
  • 用于高级搜索/过滤的.Net Web API URL 约定

    我对 Microsoft 的 REST 和 WebAPI 比较陌生 我们正在实现一个中心 REST 服务 它将容纳多种类型的对象获取和设置 作为该项目的领导者 我的任务是提出我们正在使用的正确的 Uri 设计 我想知道关于战争什么想法更好
  • 为什么我们需要 RESTful Web 服务?

    我将学习 RESTful Web 服务 最好说我必须这样做 因为它是 CS 硕士学位课程的一部分 我在 Wikipedia 上阅读了一些信息 还在 Sun Developer Network 上阅读了一篇有关 REST 的文章 我发现这不是
  • 在自定义控制器中接受 Spring Data REST URI

    我有一个 Spring Data Rest webmvc 应用程序 我想为其添加一些自定义功能以进行批量操作 我创建了一个控制器 并将其混合到 uri 命名空间中 但我希望它能够像自定义一样接受 URI search查询确实如此 而不仅仅是
  • RESTful WCF 的最低配置

    为了让 WCF 与 REST 一起工作 我至少需要在 web config 中放入什么 我已经用 WebGet 注释了我的方法 但他们没有收到消息 我发现您可以将以下内容添加到 svc 文件中的 ServiceHost 指令中 它会自动为您
  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • 使用 Spring RestTemplate 时忽略 SSL 证书验证

    我正在使用 Spring RestTemplate 发出 HTTPS 请求 并且我想忽略 SSL 证书 这是我创建restTemplate请求的代码 TrustStrategy acceptingTrustStrategy X509Cert
  • 当用户在springboot中调用注册休息API时如何获取oAuth2访问令牌?

    目前我正在研究 Springboot 安全性 这对我来说相当新 我跟着youtube视频教程 当我使用以下代码片段时 我成功获取了 oauth2 access token SpringBootApplication public class
  • 如何使用 JAXRS 和 JAXB 设置 Restlet 服务器?

    我一直在互联网上查找 试图找到如何执行此操作的示例 我只是想设置一个 REST 服务器 它自动将对象序列化到 XML 或从 XML 序列化对象 我只是想提供一个服务器 以便于用户登录 注销以及仅在用户登录后访问 XML 对象列表 启动并运行
  • PHP:在 CURL GET 调用中使用 API 密钥

    我看过关于使用 api 密钥在curl 中验证 post 调用的帖子 我有一个 GET 调用 需要 apikey 进行授权 即请求必须具有包含 apiKey 的授权标头 我已经获得了 api 密钥并尝试将其用于 GET 调用
  • 使用 Post 以 REST 方式更新值

    我对 REST 很陌生 所以如果这是一个愚蠢的问题 请原谅我 这样 我就有了客户资源 一个客户有很多信用 所以 我想获取客户积分的 URL 是 客户 21 积分 其中 21 是客户 ID 现在 如果我没有全额积分 如何添加积分 例如 客户有
  • RESTful API,如果查询字符串不够长怎么办?

    我们有产品资源集合 products 我们希望过滤此集合以仅返回具有特定列表之一的成员class id的 例如 GET products classes 100 101 102 这应该返回具有列出的任何类的产品成员的集合 我们遇到的问题是
  • 以 RESTful 方式增加资源计数器:PUT 与 POST

    我有一个带有计数器的资源 为了举例 我们将该资源称为profile 计数器是数量views对于该配置文件 Per the 休息维基 http rest blueoxen net cgi bin wiki pl HttpMethods PUT
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 如何获取数组作为 GraphQL 解析器的输入

    我想得到一个字符串数组ids查询变量中的参数并在我的解析器中使用它 下面是我的代码 People resolver ts import Resolver Query Mutation Args from nestjs graphql imp
  • 如何处理 REST api 中的 php 通知、警告和错误?

    在 REST API 中 200 响应表明操作成功 PHP 默认情况下直接在响应正文中输出错误消息 而不更改响应代码 在 SPA 中 用户无法直接看到响应文本 因此 当应用程序未按预期工作时 我通过 FireBug 检查响应正文 以检查可能

随机推荐

  • 使用 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