DELETE 请求正文的 RESTful 替代方案

2024-04-09

虽然HTTP 1.1 规范 http://www.w3.org/Protocols/rfc2616/rfc2616.html好像allow消息正文DELETE http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.7请求,它似乎表明服务器应该忽略它,因为它没有定义的语义。

4.3 消息体

服务器应该读取并转发任何请求的消息主体;如果 请求方法不包括实体主体的定义语义, 那么处理请求时应该忽略消息正文。

我已经回顾过有关此主题的一些相关讨论以及其他内容,例如:

  • HTTP DELETE 请求是否允许使用实体主体? https://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request
  • HTTP 请求方法的有效负载 https://stackoverflow.com/questions/5905916/payloads-of-http-request-methods
  • 带请求正文的 HTTP GET https://stackoverflow.com/questions/978061/http-get-with-request-body

大多数讨论似乎都同意在 DELETE 上提供消息正文可能是allowed,但一般不推荐。

此外,我注意到各种 HTTP 客户端库的趋势,这些库似乎记录了越来越多的增强功能,以支持 DELETE 上的请求主体。大多数图书馆似乎都会这样做,尽管最初偶尔会遇到一些阻力。

我的用例要求在删除时添加一些必需的元数据(例如删除的“原因”,以及删除所需的一些其他元数据)。我考虑了以下选项,但没有一个看起来完全合适且符合 HTTP 规范和/或 REST 最佳实践:

  • 邮件正文- 规范表明 DELETE 上的消息体没有语义值; HTTP 客户端不完全支持;不是标准做法
  • 自定义 HTTP 标头- 通常需要自定义标头违反标准做法 http://my.safaribooksonline.com/book/-/9781449317904/4dot-metadata-design/id2829455;使用它们与我的 API 的其余部分不一致,其中都不需要自定义标头;此外,没有好的 HTTP 响应可用于指示错误的自定义标头值(可能完全是一个单独的问题)
  • 标准 HTTP 标头- 没有合适的标准标题
  • 查询参数- 添加查询参数实际上改变了被删除的Request-URI;违反标准做法 https://stackoverflow.com/questions/2539394/rest-http-delete-and-parameters
  • 邮寄方式-(例如POST /resourceToDelete { deletemetadata }) POST 不是删除的语义选项; POST实际上代表的是opposite所需的操作(即 POST 创建资源从属;但我需要删除资源)
  • 多种方法- 将 DELETE 请求拆分为两个操作(例如,PUT 删除元数据,然后 DELETE)将原子操作拆分为两个,可能会留下不一致的状态。删除原因(和其他相关元数据)不是资源表示本身的一部分。

我的第一选择可能是使用消息正文,其次是自定义 HTTP 标头;然而,正如所指出的,这些方法也有一些缺点。

是否有任何符合 REST/HTTP 标准的建议或最佳实践,可以在 DELETE 请求中包含此类所需的元数据?还有其他我没有考虑过的替代方案吗?


尽管有些建议不要将消息正文用于 DELETE 请求,但此方法可能适合某些用例。这是我们在评估问题/答案中提到的其他选项并与服务的消费者合作后最终使用的方法。

虽然消息正文的使用并不理想,但其他选项也都不是完美合适的。请求正文 DELETE 使我们能够轻松、清晰地添加 DELETE 操作所需的附加数据/元数据的语义。

我仍然愿意接受其他想法和讨论,但想结束这个问题的循环。我感谢大家对此主题的想法和讨论!

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

DELETE 请求正文的 RESTful 替代方案 的相关文章

  • I/O 问题没有找到类 org.json.JSONObject 的序列化器,也没有发现创建 BeanSerializer 的属性

    不确定发生了什么 完整的错误是 Problem with i o No serializer found for class org json JSONObject and no properties discovered to creat
  • XML-RPC 与 REST

    我打算在这里构建一个小型服务器 并想为其创建一个 API 我正在决定什么是更好的并且已经排除了SOAP因为在我看来那件事是一团糟 我只剩下REST and XML RPC 我真的很喜欢XML RPC 它实现起来非常简单 并且足够常规 所有客
  • 如何使用 http 将 Android 中的文件从移动设备发送到服务器?

    在android中 如何使用http将文件 数据 从移动设备发送到服务器 很简单 您可以使用 Post 请求并将文件作为二进制 字节数组 提交 String url http yourserver File file new File En
  • 将 HttpApi 与 I/O 完成端口结合使用

    我刚刚偶然发现了微软的HTTP 服务器 API http msdn microsoft com en us library aa364510 28v vs 85 29 aspx 简介中写道 HTTP 服务器 API 使应用程序能够通过 HT
  • 如何确定服务器是否支持 Range 标头?

    我一直在尝试使用 Range 标头值从特定点流式传输音频 但我总是从一开始就得到歌曲 我正在通过程序执行此操作 因此不确定问题是否出在我的代码中或服务器上 如何确定服务器是否支持 Range 标头参数 Thanks 方式HTTP规范 htt
  • MPMoviePlayerController 播放 YouTube 视频

    如何在 iPhone 上的 MPMoviePlayerController 中播放 YouTube 视频 同时避免进入全屏模式 这个问题已经在这里提出 MPMoviePlayerController 正在播放 YouTube 视频吗 htt
  • 如何解析 Content-Disposition 标头以检索文件名属性?

    使用 go 如何解析从 http HEAD 请求检索到的 Content Disposition 标头以获取文件的文件名 此外 如何从 http HEAD 响应中检索标头本身 这样的事情正确吗 resp err http Head http
  • 使用特定 HTTP 方法链接到页面 (DELETE)

    如何像 Rails 那样链接到页面并让浏览器使用 DELETE 方法调用它 我试过 a href DELETE ME a 但不起作用 我使用 Node js 所以我可以用它来处理 DELETE 方法 你不能 链接只会触发 GET 请求 您可
  • Chrome 开发工具无法显示响应,即使返回的内容具有标题 Content-Type:text/html;字符集=UTF-8

    为什么我的 Chrome 开发者工具显示 无法显示响应数据 当返回的内容是text html类型时响应 在开发者工具中查看返回的响应的替代方法是什么 我认为只有当您选中 保留日志 并且您在导航离开后尝试查看先前请求的响应数据时 才会发生这种
  • ASP.NET Core URL 重写

    我正在尝试将我的网站从 www 重定向到非 www 规则以及 http 到 https https example com https example com 在中间件中 我曾经在 web config 中进行这些重定向更改 例如
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • Android - API 请求

    我开发了一个应用程序 它也在 iPhone 上 问题出在 api 请求上 我为所有请求设置了超时 有时会出现 30 60 秒的中断 看起来这个应用程序执行了几个请求 然后就中断了 一直超时 大约 45 秒后一切正常 不知道是服务器问题还是安
  • NodeJS:将 JSON 保存到 MongoDB

    我正在尝试从 API 获取 JSON 并将其存储到 MongoDB 数据库中 显然 这是行不通的 我的应用程序似乎停留在我尝试将数据保存到数据库的位置 请告知该怎么做 这是我的代码 var express require express v
  • 如何在flutter项目中使用http拦截器?

    我必须向我的所有 Api 添加标头 有人告诉我为此使用 http 拦截器 但我无法理解如何做到这一点 因为我是颤振的新手 谁能帮我举个例子吗 您可以使用http 拦截器 https pub dev packages http interce
  • 我可以使用 HTTP 范围标头“有意”加载部分文件吗?

    我正在研究 HTTP 范围标头 specs http www w3 org Protocols rfc2616 rfc2616 sec14 html sec14 16 据我了解 我可以设置文件的字节范围ala 0 199 2000 200
  • JAX-RS 和 JAX-WS 有什么区别?

    阅读了几篇有关 JAX RS 和 JAX WS 的文章后 我有几个问题想确认一下 JAX RS可以像JAX WS一样做异步请求吗 JAX RS 能否访问不在 Java 平台上运行的 Web 服务 反之亦然 REST 对于配置文件有限的设备
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • Web 服务应该是事务性的吗?

    我正在研究为应用程序编写网络服务 在此应用程序中 我们在事务中执行所有操作 因为 工作单元 通常不是单个实体 而是跨越多个表的多个实体 在某些情况下 我们想要 全有或全无 而交易是非常有意义的 然而 我不太确定如何在网络服务中执行此操作 也
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重

随机推荐

  • 如果我在 onResume 中调用 getMeasuredWidth() 或 getWidth() 进行布局,它们将返回 0

    如果我在 onResume 中调用 getMeasuredWidth 或 getWidth 进行布局 它们将返回 0 我认为此时此刻还没有绘制出该视图 另外 我认为我需要将 getMeasuredWidth 或 getWidth 放入绘制布
  • 使用 MingW 64 绕过 fork() 的最佳方法?

    我浏览了十几个关于 Windows 没有的链接fork 以及应该如何使用CreateProcess or CreateThread试图解决这个问题 但是不允许时间和风险来重写一大段遗留代码 有没有一种快速 简单的方法来获取fork在 Win
  • Ruby 中 as_json 和 to_json 方法的区别

    两种方法有什么区别as json and to json 它们相同吗 如果不是的话它们之间有什么区别 to json返回字符串 as json返回带有字符串键的哈希值 gt name gt Konata Izumi age gt 16 1
  • 实体框架 - 首先反向工程代码 - 覆盖更改

    我使用 EF Power Tools 来反向工程现有的数据库 这可以 在 EDMX 数据库第一条路线下 我将为任何覆盖 例如数据注释 创建部分类 例如这里 账期是原始的 EntityObject MetadataType typeof Le
  • 如何 grep grep 返回的文件内容?

    当我使用以下命令查找带有错误消息的日志文件时grep error log 它返回日志文件列表 grep error log Binary file out0080 2011 01 07 12 38 log matches Binary fi
  • 检查调用和未调用时 Mockk 验证失败

    我正在尝试使用以下命令验证是否未调用函数 verify managementService deleteUser any wasNot Called 该验证失败并显示以下消息 验证失败 调用第 1 个 共 1 个 ManagementSer
  • OpenCV:imread给出CV_8UC3,无法转换为CV_8UC4?

    需要有关我尝试使用 OpenCV 加载和转换的图像的帮助 这是我的代码 templ imread Template bmp 1 cout lt lt templ before convert lt
  • 没有 RTTI 的情况下编译 c++ 什么时候会出现问题?

    我正在使用 gcc fno rtti标志在没有运行时类型信息的情况下编译我的 C 假设我没有使用dynamic cast lt gt or typeid 有什么可能导致我以后出现问题吗 由于您的问题特定于 GCC 您应该仔细查阅您正在使用的
  • 将管理证书与 azure REST API 一起使用

    我在我的应用程序中使用 azure 服务管理 REST API 我在azure上上传了管理证书 并在本地有一份副本 我将认证保存在应用程序本身的单独文件夹 AzureCertificate 中并引用该位置 例如 字符串证书路径 Server
  • Rails + PostgreSQL - 使用 Like

    我有以下两个疑问 SELECT users FROM users WHERE fname lname LIKE james SELECT users FROM users WHERE fname lname LIKE James 我在用户表
  • Mongoose Schema.update 不更新布尔值

    我尝试过更新其他字段 效果很好 我在 API 中使用的命令 User update email targetUser email set isAdmin true push log updated new Date function err
  • 如何在 Android 应用程序中访问 graph.windows.net Microsoft Azure Graph API?

    我已要求 IT 管理员添加一个名为EmployeeId以 Azure Active Directory 的目录扩展的形式 与我们的现场 AD 同步 当给定用户登录我的 Android 应用程序时 我试图检索该值 我已经关注了this htt
  • Cloud9 Watir/Selenium 测试

    我已经为一个简单的持续集成和交付系统设置了 Cloud9 和 Codeship 它非常适合开发我的网站 应用程序 有没有人能够在 Cloud9 IDE 中开发和运行基于浏览器的 Cucumber 测试 如果是这样 需要什么样的设置 附言 我
  • IIS6 ASP.NET 2.0 应用程序缓存 - 大量数据的数据存储选项和性能

    在 ASP NET 2 0 站点中IIS6我想将键 值对存储在应用程序缓存中 每个键始终是一个长度为 5 个字符的字符串 每个值都是一个长度为 15 250 个字符的字符串 使用场景是 每个网页请求都会查询一次缓存 如果键存在 则使用值 否
  • 如何重命名我的 asp.net 网页

    我的页面名称为 XYZ aspx 现在我想更改ABC aspx我应该怎么做 当我直接从解决方案资源管理器更改它时 它给了我一个错误 谁可以帮我这个事 谢谢 Smartdev ASP NET 文件通常由 1 3 个文件组成 具体取决于项目类型
  • iText5.1.0在文档中设置页眉和页脚[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 servlet 来查看
  • 无需 MSI 文件即可卸载

    我经常遇到 Windows Installer 尝试卸载软件包的问题 但它抱怨 您尝试使用的功能所在的网络资源不可用 当原始 MSI 根本不可用时 是否有已知的方法可以卸载此类软件包 请注意 微软现在已经发布了一个官方工具来解决这些问题 并
  • 替换序列化数据中的类名

    我想在序列化数据流中将字符串 com oldpackage className 替换为 com newPackage className 该序列化数据从数据库中读取并在替换字符串后更新 我在做同样的事情时遇到了一些问题 如果您已经猜到了 这
  • appdeeplink Github .wellknown 文件夹无法识别

    I am adding app deep linking functionality in my app i followed as per applink assist i created well known folder in git
  • DELETE 请求正文的 RESTful 替代方案

    虽然HTTP 1 1 规范 http www w3 org Protocols rfc2616 rfc2616 html好像allow消息正文DELETE http www w3 org Protocols rfc2616 rfc2616