我正在编写一个服务器,用于处理来自javascript注释包(annotatorjs.org)的http请求。javascript向服务器发送一个HTTP DELETE请求,其中包含路径中对象的id,还在JSON对象中发送请求正文中的注释。
我已经尝试过使用Java Web服务对象和普通的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命令在没有body的情况下成功:
curl -i -X DELETE http://localhost:8080/text/api/store/delete/555608203004e74adbf65343 HTTP/1.1 200 OK服务器: GlassFish服务器开放源码版本4.1 X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish服务器开放源码版本4.1 Java/Oracle公司/1.8)日期: Tue,2015年5月19:35:08 GMT内容长度:0
我使用body的curl命令失败了:
curl -i -X DELETE -d @test.json http://localhost:8080/text/api/store/delete/555608203004e74adbf65343 HTTP/1.1 400错误请求服务器: GlassFish服务器开放源码版本4.1 X支持: Servlet/3.1 JSP/2.3 (GlassFish服务器开放源码版本4.1 Java/Oracle公司/1.8)日期: Tue,2015年5月19日19:35:16 GMT连接:关闭Content-Length: 0
发布于 2015-05-20 04:00:20
和GET一样,DELETE不应该有主体。
RFC:https://www.rfc-editor.org/rfc/rfc7231#section-4.3.5
删除请求消息中的有效负载没有定义的语义;在DELETE请求上发送有效负载主体可能会导致一些现有的实现拒绝该请求。
最好的做法是,不要这样做。
有人可能会说,这是服务器中的一个bug。但服务器也可以合法地声称,这是一种罕见的情况,它有权拒绝服务。
发布于 2015-05-20 12:41:04
由于DELETE方法没有显式定义有效负载(RFC 7231 section 4.3.5),因此它应该遵循的相关准则是RFC 7230 section 3.3
通过Content-Length或Transfer-Encoding报头字段通知请求中存在消息体。请求消息成帧独立于方法语义,即使该方法没有定义消息体的任何用途。
服务器符合标准的正确行为是使用并忽略有效负载,或者以某种特定于API的方式对其执行操作。该"API特定方式“可以是发送400或任何其它状态码。
您正在使用的第二个curl测试似乎没有向API发送任何JSON数据。当我运行它时,它只是将测试字符串"test.json“作为有效负载发送。所以不清楚服务器拒绝了什么(有效负载是否存在?或者未知的有效载荷格式?)。
如果您可以设计一个测试,正确地证明服务器仅在存在有效负载时拒绝,那么您应该针对服务器提交一个错误。
发布于 2015-05-20 03:55:03
第二个curl命令的响应包含Content-Length:0
我认为curl发出的请求不正确地发送了Content-Length属性。
https://stackoverflow.com/questions/30334776
复制相似问题