【问题标题】:RequestBody not accepted for RequestMethod.DELETERequestMethod.DELETE 不接受 RequestBody
【发布时间】:2023-04-01 15:35:02
【问题描述】:
我正在使用 tomcat v8 并尝试通过 RequestBody 将对象发布到我的 REST API。这个 REST API 基本上是 RequestMethod.DELETE,因为这个 API 内部的逻辑是删除在 RequestBody 中传递的对象。
这对我不起作用。我不得不稍后将我的方法转换为 POST 但我仍然想知道 DELETE 不接受 RequestBody 吗?
这是来自 Spring 框架或 REST 原则的限制,还是与我的 Tomcat 配置 (server.xml) 文件有关。
【问题讨论】:
标签:
java
ajax
spring
rest
tomcat8
【解决方案1】:
但我仍然想知道 DELETE 不接受 RequestBody 吗?
这是预期的行为。 HTTP 1.1 规范的RFC 7231 版本指出:
删除请求消息中的有效负载没有定义的语义;在 DELETE 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。
在这种情况下,您似乎遇到了 Tomcat 中的默认限制。 (根据 HTTP 规范,这是完全合法的行为。)
您可以覆盖默认行为:请参阅the other answer。然而,我觉得糟糕的 API 设计让 DELETE 动词允许或要求请求正文。当然这是违反直觉的。
【解决方案2】:
这是来自 Spring 框架还是 REST 原则的限制
或与我的 Tomcat 配置 (server.xml) 文件有关的事情
是的,您与 Tomcat 配置有关。
您必须在 server.xml 中启用解析 DELETE 方法(PUT 也是如此),如下所示:
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
parseBodyMethods="POST,PUT,DELETE"
redirectPort="8443" />