Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Servlets 3.1:如何处理删除请求中的正文_Java_Servlets_Glassfish - Fatal编程技术网

Java Servlets 3.1:如何处理删除请求中的正文

Java Servlets 3.1:如何处理删除请求中的正文,java,servlets,glassfish,Java,Servlets,Glassfish,我正在编写一个服务器,用于处理来自javascript注释包(annotatorjs.org)的http请求。javascript向服务器发送HTTP DELETE请求,该请求在路径中包含对象的id,并在JSON对象的请求体中发送注释 我已经尝试使用JavaWeb服务对象和普通servlet来实现删除请求。在这两种情况下,当我在没有正文的情况下提出请求时,它都会起作用,但当我添加正文时,我会得到一个错误的请求 这是我的servlet @WebServlet("/api/store/delete/

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

我已经尝试使用JavaWeb服务对象和普通servlet来实现删除请求。在这两种情况下,当我在没有正文的情况下提出请求时,它都会起作用,但当我添加正文时,我会得到一个错误的请求

这是我的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命令(无正文)成功:

curl-i-X删除 HTTP/1.1200ok 服务器:GlassFish服务器开源版本4.1 X-Powered-By:Servlet/3.1 JSP/2.3(GlassFish服务器开源版4.1 Java/Oracle Corporation/1.8) 日期:2015年5月19日星期二19:35:08 GMT 内容长度:0

我对body的curl命令失败:

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

第二个curl命令的响应包含
内容长度:0


我认为curl发出的请求错误地发送了Content-Length的request属性

DELETE不应该像GET一样有一个主体

RFC:

删除请求消息中的有效负载没有定义的语义; 在删除请求上发送有效负载正文可能会导致某些现有错误 实现拒绝请求

最好的做法是,不要这样做



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

由于DELETE方法没有明确定义有效负载(),因此它应该遵循的相关准则是:

请求中存在消息体是由 内容长度或传输编码头字段。请求消息 框架独立于方法语义,即使方法确实如此 不定义消息正文的任何用途

服务器符合标准的正确行为是使用并忽略有效负载,或者以特定于API的方式对其进行操作。该“API特定方式”可以是发送400或任何其他状态代码

您使用的第二个curl测试似乎没有向API发送任何JSON数据。当我运行时,它只发送测试字符串“test.json”作为有效负载。因此不清楚服务器拒绝了什么(有效负载存在?或未知有效负载格式?)


如果你能设计一个测试,正确地证明服务器仅仅因为有效负载的存在而拒绝,那么你应该针对服务器提交一个bug。

我的代码没有生成删除请求,它来自我正在使用的javascript包(annotatorjs.org)。但我明白你的意思。我的问题是基于这一点,当时的共识似乎是允许这样做。但在您的链接中,它表示可能不允许,具体取决于服务器实现。我想我的问题是,有没有办法在Glassfish中配置这种行为?真倒霉。您可以向Glassfish提交bug以接受删除主体;或者,您可以将一个bug提交到annotators.org,以不发送删除正文。或者两者都有——双方都错了。其他一些尝试可能是:创建一个接受此URL模式的过滤器,甚至是一个扩展“GenericServlet”(而不是HttpServlet)的新Servlet;这个问题最初是因为另一个客户端被发现的,该客户端应该发送正确的请求。源服务器需要理解每个请求的含义。如果它接收到一个带有主体的删除,并且它不知道请求试图表达什么意思,那么响应400并没有错。可以说,拒绝请求比无正文接受请求更安全。当然,servlet容器不是整个源服务器,只是将请求转发给应用程序的“中间人”,如果它在未咨询应用程序的情况下简单地拒绝任何带正文的删除,那么它就是有缺陷的。Amos,我的curl命令中有一个输入错误-我在发送名为test.json的文件时漏掉了“@”。对于Annotator.js的用户,我只是想说我可以通过商店插件中的一个选项来解决这个问题,这个选项叫做emulateHTTP。当此选项设置为true时,删除和更新操作将通过HTTP POST发送到服务器,并且请求头X-HTTP-METHOL-Override包含所需的操作(PUT或delete)