【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
发出HTTP DELETE请求时,请求URI应该完全标识要删除的资源。 但是,是否可以在请求的实体中添加额外的元数据?
#1楼
HTTP 1.1规范( RFC 7231 )的最新更新明确允许DELETE请求中的实体主体:
DELETE请求消息中的有效负载没有定义的语义。 在DELETE请求上发送有效内容主体可能会导致某些现有实现拒绝该请求。
#2楼
似乎ElasticSearch使用以下代码: https ://www.elastic.co/guide/zh-CN/elasticsearch/reference/5.x/search-request-scroll.html#_clear_scroll_api
这意味着Netty支持这一点。
就像评论中提到的那样,情况可能不再如此
#3楼
在删除请求中使用主体的原因之一是为了实现乐观的并发控制。
您阅读记录的版本1。
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
您的同事读取该记录的版本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;
}
}
#4楼
某些版本的Tomcat和Jetty似乎会忽略实体主体(如果存在)。 如果您打算接收,可能会很麻烦。
#5楼
该规范没有明确禁止或阻止它,因此我倾向于说它是允许的。
Microsoft在MSDN文章中谈到ADO.NET数据服务框架的DELETE方法时说,微软以相同的方式(我可以听到听众在抱怨)。
如果DELETE请求包含实体主体,则该主体将被忽略[...]
另外,这是RFC2616 (HTTP 1.1)关于请求必须说的内容:
- 仅当消息主体存在时, 实体主体才存在(第7.2节)
- 通过包含
Content-Length
或Transfer-Encoding
标头来指示消息正文的存在(第4.3节) - 如果请求方法的规范不允许发送实体主体,则不得包含消息 主体 (第4.3节)
- 仅在TRACE请求中明确禁止实体实体 ,所有其他请求类型均不受限制(特别是第9和9.8节)
对于响应,已定义为:
- 是否包含消息正文取决于请求方法和响应状态(第4.3节)
- 明确禁止在响应HEAD请求时使用消息正文(特别是第9和9.4节)
- 在1xx(信息性),204(无内容)和304(未修改)响应中明确禁止了消息正文 (第4.3节)
- 所有其他响应都包括一个消息正文,尽管它的长度可能为零(第4.3节)
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3149199