在发出HTTP DELETE请求时,请求URI应该完全标识要删除的资源。但是,是否允许添加额外的元数据作为请求实体主体的一部分?
当前回答
值得注意的是,OpenAPI 3.0版本的规范放弃了对带体的DELETE方法的支持:
请看这里和这里的参考资料
这可能会影响将来这些api的实现、文档或使用。
其他回答
这个没有定义。
DELETE请求消息中的有效负载没有定义的语义; 在DELETE请求上发送有效负载主体可能会导致一些现有的问题 实现来拒绝请求。 https://www.rfc-editor.org/rfc/rfc7231#page-29
在删除请求中使用主体的一个原因是为了进行乐观并发控制。
你读了唱片的第一个版本。
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
你的同事读了记录的第一个版本。
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
你的同事更改了记录并更新了数据库,数据库将版本更新为2:
PUT /some-resource/1 { id:1, status:"important", version:1 }
200 OK { id:1, status:"important", version:2 }
你试着删除记录:
DELETE /some-resource/1 { id:1, version:1 }
409 Conflict
您应该得到一个乐观锁异常。重新阅读记录,确认它的重要性,也许不要删除它。
使用它的另一个原因是一次删除多条记录(例如,具有行选择复选框的网格)。
DELETE /messages
[{id:1, version:2},
{id:99, version:3}]
204 No Content
注意,每个消息都有自己的版本。也许您可以使用多个头文件指定多个版本,但对于George来说,这更简单、更方便。
这适用于Tomcat(7.0.52)和Spring MVC(4.05),可能也适用于更早的版本:
@RestController
public class TestController {
@RequestMapping(value="/echo-delete", method = RequestMethod.DELETE)
SomeBean echoDelete(@RequestBody SomeBean someBean) {
return someBean;
}
}
Roy Fielding在HTTP邮件列表上澄清了HTTP邮件列表https://lists.w3.org/Archives/Public/ietf-http-wg/2020JanMar/0123.html并说:
GET/DELETE主体绝对禁止产生任何影响 对请求的处理或解释
这意味着主体不能修改服务器的行为。 然后他补充道:
除了 为了维护,必须读取和丢弃接收到的字节 信息框架。
最后是不禁止尸体的原因
我们不禁止派人去的唯一原因是 因为这将导致懒惰的实现,假设没有人会这样做 被发送。
因此,当客户端可以发送有效负载主体时,服务器应该丢弃它 和api不应该为这些请求的有效载荷体定义语义。
如果有人在测试中遇到这个问题,不,它不是普遍支持的。
我目前正在用Sahi Pro进行测试,很明显,http DELETE调用剥离了任何提供的主体数据(根据端点设计批量删除的大量id列表)。
我已经和他们联系了几次,也把脚本、图片、日志三个包分开发给他们审核,他们还没有确认。一个失败的补丁,后来他们的支持缺席了电话会议,我仍然没有得到一个可靠的答案。
我确定Sahi不支持这个功能,而且我可以想象有许多其他的工具跟随套件。
只是一个提示,如果你在你的DELETE请求中提供了一个主体,并且使用了谷歌云HTTPS负载均衡器,它将拒绝你的请求,错误为400。我的头撞到墙上,然后发现谷歌,不管出于什么原因,认为一个带有主体的DELETE请求是一个畸形的请求。
推荐文章
- ReferenceError: description没有定义NodeJs
- REST API - dto还是不是?
- OData和REST web服务的区别
- 用Spring我可以做一个可选的路径变量吗?
- 什么是HTTP“主机”报头?
- 哪个HTTP状态代码表示“尚未准备好,稍后再试”?
- Django REST框架:向ModelSerializer添加额外字段
- 如何阻止恶意代码欺骗“Origin”报头来利用CORS?
- 为什么说“HTTP是无状态协议”?
- 我需要HTTP GET请求的内容类型报头吗?
- REST和RPC之间的Web服务差异
- 如何让Chrome允许混合内容?
- 正确的方式删除cookies服务器端
- REST DELETE真的是幂等的吗?
- 如何用node.js实现一个安全的REST API