在发出HTTP DELETE请求时,请求URI应该完全标识要删除的资源。但是,是否允许添加额外的元数据作为请求实体主体的一部分?
当前回答
如果有人在测试中遇到这个问题,不,它不是普遍支持的。
我目前正在用Sahi Pro进行测试,很明显,http DELETE调用剥离了任何提供的主体数据(根据端点设计批量删除的大量id列表)。
我已经和他们联系了几次,也把脚本、图片、日志三个包分开发给他们审核,他们还没有确认。一个失败的补丁,后来他们的支持缺席了电话会议,我仍然没有得到一个可靠的答案。
我确定Sahi不支持这个功能,而且我可以想象有许多其他的工具跟随套件。
其他回答
ElasticSearch似乎使用了这个: https://www.elastic.co/guide/en/elasticsearch/reference/5.x/search-request-scroll.html#_clear_scroll_api
也就是说妮蒂支持这个。
就像评论中提到的那样,情况可能不再是这样了
也许下面的GitHUb url会帮助你,得到答案。 实际上,应用服务器,如Tomcat, Weblogic拒绝HTTP。带请求有效负载的DELETE调用。所以记住这些东西,我已经在github中添加了例子,请看看
https://github.com/ashish720/spring-examples
我认为这个问题还没有一个好的答案,尽管已经有很多关于现有答案的很好的评论。我将把这些评论的要点升华为一个新的答案:
RFC7231中的这段话已经被引用了几次,这确实总结了它。
DELETE请求消息中的有效负载没有定义的语义; 在DELETE请求上发送有效负载主体可能会导致一些现有的问题 实现来拒绝请求。
我忽略了其他答案的含义。是的,允许在DELETE请求中包含一个主体,但这在语义上是没有意义的。这实际上意味着,发出带有请求体的DELETE请求在语义上等同于不包含请求体。
包含一个请求体不应该对请求有任何影响,所以包含它是没有意义的。
tl;dr:从技术上讲,一个带有请求体的DELETE请求是允许的,但是这样做是没有用的。
只是一个提示,如果你在你的DELETE请求中提供了一个主体,并且使用了谷歌云HTTPS负载均衡器,它将拒绝你的请求,错误为400。我的头撞到墙上,然后发现谷歌,不管出于什么原因,认为一个带有主体的DELETE请求是一个畸形的请求。
在我看来,RFC 2616并没有规定这一点。
从第4.3节开始:
The presence of a message-body in a request is signaled by the inclusion of a Content-Length or Transfer-Encoding header field in the request's message-headers. A message-body MUST NOT be included in a request if the specification of the request method (section 5.1.1) does not allow sending an entity-body in requests. A server SHOULD read and forward a message-body on any request; if the request method does not include defined semantics for an entity-body, then the message-body SHOULD be ignored when handling the request.
9.7节:
The DELETE method requests that the origin server delete the resource identified by the Request-URI. This method MAY be overridden by human intervention (or other means) on the origin server. The client cannot be guaranteed that the operation has been carried out, even if the status code returned from the origin server indicates that the action has been completed successfully. However, the server SHOULD NOT indicate success unless, at the time the response is given, it intends to delete the resource or move it to an inaccessible location. A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, 202 (Accepted) if the action has not yet been enacted, or 204 (No Content) if the action has been enacted but the response does not include an entity. If the request passes through a cache and the Request-URI identifies one or more currently cached entities, those entries SHOULD be treated as stale. Responses to this method are not cacheable.c
因此,它没有显式地允许或禁止,并且代理可能会删除消息体(尽管它应该读取并转发它)。
推荐文章
- 如何POST JSON数据与PHP卷曲?
- HTTP 1.1和HTTP 2.0的区别是什么?
- REST身份验证方案的安全性
- 如何在package.json中使用“main”参数?
- 什么是“升级-不安全-请求”HTTP报头?
- HTTP 301和308状态码有什么区别?
- 跨REST微服务的事务?
- 什么HTTP状态码应该用于错误的输入
- 编排microservices
- 如何使HTTP请求在PHP和不等待响应
- PATCH和PUT请求的主要区别是什么?
- 调用webrequest, POST参数
- 我可以把我所有的http://链接都改成//吗?
- URL为AJAX请求编码一个jQuery字符串
- 编译System.Net.HttpClient的查询字符串