当前位置: 首页 > 知识库问答 >
问题:

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

壤驷凯
2023-03-14

我正在编写一个服务器,用于处理来自javascript注释包(annotatorjs.org)的超文本传输协议请求。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 DELETEhttp://localhost:8080/text/api/store/delete/555608203004e74adbf65343HTTP/1.1 200 OK Server: GlassFishServer Open Source Edition 4.1 X-Powerd-By: Servlet/3.1 JSP/2.3(GlassFishServer Open Source Edition 4.1Java /OracleCorporation/1.8)日期: 5月19日星期二2015 19:35:08GMT内容-长度: 0

我的curl命令与body失败:

curl-i-X DELETE-d@test。jsonhttp://localhost:8080/text/api/store/delete/555608203004e74adbf65343HTTP/1.1 400错误请求服务器: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

共有3个答案

金坚
2023-03-14

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

我认为curl发出的请求,是不正确地发送Content-L长度的请求属性。

丁景山
2023-03-14

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

请求中存在消息体由内容长度或传输编码头字段表示。请求消息框架独立于方法语义,即使该方法没有定义消息体的任何用途。

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

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

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

傅志用
2023-03-14

DELETE不应该像GET一样有一个body。

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

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

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

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

 类似资料:
  • 问题内容: 我需要按以下方式处理请求: 它应该接受介于和之间的值中的任何类型的字符?。请注意,将位于的值将是一个值,而不是操作的名称。 例如:其中第一个请求应将用户重定向到页面(因为那是名称),第二个请求应将用户lkikf连同参数名称的值一起重定向到页面。 我有下面的控制器来处理它,但是问题是当我的地址中有/时,控制器无法处理它。 我用下面的正则表达式不起作用。 问题答案: 你必须创建两个方法,然

  • 我需要按以下方式处理请求: 它应该接受位于和之间的值中的任何类型的字符。请注意,将位于那里的值将是一个单独的值,而不是一个动作的名称。 我使用了以下正则表达式,但这不起作用。

  • 问题内容: 我想在继续执行正文之前检查请求的标头是否包含某个标头。例如,我要检查标题中是否包含multipart / form- data 。如果不是,则无需继续上载通常对于文件上载而言很大的多部分主体。 Servlet是否允许您执行此操作?我尝试在Google上随机搜索,但是没有运气。这是我在servlet中尝试的代码,但是在调用此方法之前,它仍然继续接收主体。似乎在调用servlet之前已完全

  • 问题内容: 假设我有某种游戏。我有一个buyItem函数,如下所示: 如果我对该路由进行垃圾邮件处理,直到扣除用户余额(第二次查询),则用户余额仍为正。 我尝试过的 问题是将在第一〜5项要求。因此,这也不起作用。 我们如何处理这种情况?如果重要的话,我正在使用Sails.JS框架。 问题答案: 通过该方法,Sails 1.0现在具有完整的事务支持。例: 更新资料 正如一些评论者所指出的,启用连接池

  • 我正在使用OkHttpClient向网站的网页url发送请求,并通过以下方法存储它提供的cookie,我仅从stackoverflow获得该方法。 有必要存储cookie,否则网站会将请求重定向到超时页面。 然后,我看到页面的html来检查我是否到达了正确的网址。 现在,我以类似于网址“www.example.com/loginPage”的方式制作另一个请求变量,并尝试查看html,但它将我重定向

  • 我有一个在数据库上运行查询的API。由于查询执行时间可能很长,比如3分钟到10分钟,我的负载平衡器返回“上游请求超时”,但我可以看到查询已提交到数据源,但对最终用户来说,它显示了错误的消息。如何应对这种情况? 我的职能