首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Servlet 3.1:如何在DELETE请求中处理正文

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

Stack Overflow用户
提问于 2015-05-20 03:44:40
回答 3查看 3.4K关注 0票数 2

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

我已经尝试过使用Java Web服务对象和普通的servlet来实现DELETE请求。在这两种情况下,当我在没有主体的情况下发出请求时,它可以工作,但当我添加主体时,我得到一个400 Bad Request。

这是我的servlet

代码语言:javascript
复制
@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

EN

回答 3

Stack Overflow用户

发布于 2015-05-20 04:00:20

和GET一样,DELETE不应该有主体。

RFC:https://www.rfc-editor.org/rfc/rfc7231#section-4.3.5

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

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

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

票数 3
EN

Stack Overflow用户

发布于 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“作为有效负载发送。所以不清楚服务器拒绝了什么(有效负载是否存在?或者未知的有效载荷格式?)。

如果您可以设计一个测试,正确地证明服务器仅在存在有效负载时拒绝,那么您应该针对服务器提交一个错误。

票数 3
EN

Stack Overflow用户

发布于 2015-05-20 03:55:03

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

我认为curl发出的请求不正确地发送了Content-Length属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30334776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档