Servlets 3.1:如何在DELETE请求中处理正文

时间:2015-05-19 19:44:40

标签: java servlets glassfish

我正在编写一个服务器,用于处理来自javascript注释包(annotatorjs.org)的http请求。 javascript向服务器发送HTTP DELETE请求,该请求包含路径中对象的id,并且还在JSON对象中的请求正文中发送注释。

我尝试使用Java Web Services对象和普通servlet实现DELETE请求。在这两种情况下,当我在没有正文的情况下发出请求时,它会起作用,但是当我添加一个正文时,我会得到一个400 Bad Request。

这是我的servlet

@WebServlet("/api/store/delete/*")
public class AnnotatorServlet extends HttpServlet {  

    @Override protected void doDelete( HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            System.out.println("received DELETE request,requestURI="+request.getRequestURI());        
    }
} 

我的卷曲命令,没有身体成功:

curl -i -X DELETE http://localhost:8080/text/api/store/delete/555608203004e74adbf65343 HTTP / 1.1 200好的 服务器:GlassFish Server开源4.1版 X-Powered-By:Servlet / 3.1 JSP / 2.3(GlassFish Server开源版4.1 Java / Oracle Corporation / 1.8) 日期:2015年5月19日星期二19:35:08 GMT 内容长度:0

我的身体卷曲命令失败:

curl -i -X DELETE -d @ test.json http://localhost:8080/text/api/store/delete/555608203004e74adbf65343 HTTP / 1.1 400错误请求 服务器:GlassFish Server开源4.1版 X-Powered-By:Servlet / 3.1 JSP / 2.3(GlassFish Server开源版4.1 Java / Oracle Corporation / 1.8) 日期:2015年5月19日星期二19:35:16 GMT 连接:关闭 内容长度:0

3 个答案:

答案 0 :(得分:3)

DELETE不应该有一个正文,就像GET一样。

RFC:http://tools.ietf.org/html/rfc7231#section-4.3.5

  

DELETE请求消息中的有效负载没有定义的语义;   在DELETE请求上发送有效负载主体可能会导致某些存在   拒绝请求的实现。

最佳做法是,不要这样做。

有人可能会说,这是服务器中的一个错误。但服务器也可以合法地声称,这是一种罕见的情况,它有权拒绝服务。

答案 1 :(得分:3)

由于DELETE方法明确没有定义有效负载(RFC 7231 section 4.3.5),因此它应遵循的相关指南是RFC 7230 section 3.3

  

请求中存在消息正文由a发出信号     Content-Length或Transfer-Encoding标头字段。请求消息     即使方法有效,框架也与方法语义无关     没有定义消息体的任何用途。

服务器的正确标准兼容行为是消耗和忽略有效负载,或者以某种特定于API的方式对其执行操作。那种" API特定方式"可能正在发送400或任何其他状态代码。

您正在使用的第二个卷曲测试似乎并未向API发送任何JSON数据。当我运行它时,只需发送测试字符串" test.json"作为有效载荷。所以不清楚服务器拒绝什么(有效载荷存在?或未知的有效载荷格式?)。

如果您可以设计一个能够正确证明服务器仅仅存在有效负载的测试,那么您应该对服务器提出错误。

答案 2 :(得分:0)

第二个curl命令的响应包含Content-Length:0

我认为curl提出的请求是错误地发送Content-Length的Request属性。