【问题标题】:Why is not a good practice to have an entity body in a HTTP DELETE request?为什么在 HTTP DELETE 请求中包含实体主体不是一个好习惯?
【发布时间】:2014-05-07 09:10:29
【问题描述】:

我正在使用 JavaJAX-RS 处理 Restful Web Services,我遇到了发送 DELETE 请求的问题带有实体。

我花了几个小时寻找发送 DELETE 请求并在正文中包含消息的方法,但我发现的唯一内容是 work around using the Apache HttpClient

我发现的一些答案是说在DELETE 请求中有一个正文是没有意义的,而且我看到许多服务器通过不允许带有正文的DELETE 来支持这一点。 例如"entity enclosing DELETE requests make no sense"

所以我的问题是为什么在DELETE 请求中包含正文不是一个好习惯?这样做有什么缺点?

谢谢

【问题讨论】:

  • 可能是因为没有真正的理由在响应中包含正文。只要您知道 DELETE 已成功处理,您为什么还要关心响应消息?
  • 如果你允许没有意义的事情,最终会有人有一个“好主意”,并开始使用这种可能性来采取一种意想不到的方法,带来意想不到的后果。打个比方,Web 浏览器“原谅” HTML 错误导致 WWW 包含大量格式错误的页面,这些页面可以在某些浏览器中显示,但不能在其他浏览器中显示。
  • @TimCastelijns 我问的是请求中的正文而不是响应。传递有助于删除过程的数据。
  • 您能否举一个示例,说明您希望在正文中传递但不能粘贴在 URI 中的数据?
  • @Gimby 我能想到的最简单的事情是使用主键作为标识符从数据库表中删除记录。我知道这可以使用 URI 来完成,但是如果您想删除多条记录怎么办?传递正文中的信息不是比执行多个请求更好吗?

标签: java http rest web protocols


【解决方案1】:

DELETE 方法请求源服务器删除由 Request-URI 标识的资源。并且 Web 服务器上的每个资源都仅由 URI 标识。这就是为什么在 DELETE 中拥有 body 没有意义

【讨论】:

  • 我理解这个概念,但这限制了您一次删除一个资源。那么删除多个资源的好习惯是什么?一种方法是执行多个 DELETE 请求,这显然不是性能方面的最佳选择。还有什么?
  • @NikosDim,深度讨论@@stackoverflow.com/questions/17085216/… 会以某种方式帮助你
【解决方案2】:

REST 是嘈杂的,很可能每个资源的单独 DELETE 调用是意图。对于有限数量的 id,您可以在集合资源上使用查询参数:

DELETE /widgets?id=1,2,4,16,256

一般来说,您应该能够将查询参数用作集合的 DELETE 上的过滤器,就像您对该集合的 GET 一样。

【讨论】:

  • 正如你所说,它的数量有限。如果某人的 id 很长,那么您很容易达到 URL 限制,如果您将所有这些信息放在 DELETE 请求的正文中,就可以避免这种情况。
  • 好吧,你可以做你想做的事,但是如果你尝试传递一个 DELETE 请求的主体,许多框架和容器会出现异常。他们如何行为不端因应用程序而异。彻底测试。
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多