Servlets 如何检测HttpServletRequest是否有正文?

Servlets 如何检测HttpServletRequest是否有正文?,servlets,Servlets,我试图检测一个http请求是否有正文,而不读取它或做任何使现有代码无法处理它的事情,不管它在流中稍后做什么 boolean hasBody(HttpServletRequest http) { boolean hasBody = false; try { hasBody = http.getInputStream() != null; // always gives true hasBody = http.getReader().ready();

我试图检测一个http请求是否有正文,而不读取它或做任何使现有代码无法处理它的事情,不管它在流中稍后做什么

boolean hasBody(HttpServletRequest http) {
    boolean hasBody = false;
    try {
        hasBody = http.getInputStream() != null; // always gives true
        hasBody = http.getReader().ready(); // always gives IllegalStateException
    } catch (IOException e) {
    }
    return hasBody;
}
不幸的是,当我用身体测试GET和POST时,我能想到的两个检查都不起作用


注意,我不想这样做:
“POST”.equals(http.getMethod())
!“GET”.equals(http.getMethod())
,如果可能的话,因为我不确定有哪些方法可以有body或没有body。

您可以使用getContentLength()或getContentLengthLong()并检查它是否为正。

您可以使用getContentLength()或getContentLengthLong()并检查它是否为正。

包含正文的请求应设置特定的标题(如果随后出现)

请求中存在消息体是由 内容长度或传输编码头字段

您可以使用
http.getHeader(“传输编码”)!=null | | http.getHeader(“内容长度”)!=空


请求正文可能存在但为空。如果您想捕捉到这一点,可以添加内容长度>0的检查,但这仅在请求包含内容长度标头时才起作用。看起来您必须尝试读取请求正文,以查看在没有内容长度头的情况下它是否为空。

包含正文的请求如果后面有特定的头,则应设置相应的头

请求中存在消息体是由 内容长度或传输编码头字段

您可以使用
http.getHeader(“传输编码”)!=null | | http.getHeader(“内容长度”)!=空


请求正文可能存在但为空。如果您想捕捉到这一点,可以添加内容长度>0的检查,但这仅在请求包含内容长度标头时才起作用。看起来您必须尝试读取请求正文,以查看在没有内容长度标题时它是否为空。

Get't have bodytrue,但是关于选项DELETE呢?我想知道是否存在,而不尝试从getMethod()中猜测Get不具有bodytrue,但是关于选项DELETE呢?我想知道是否有或没有,但不尝试从getMethod()猜一猜我将使用:hasBody=http.getContentLength()>-1,我怎么能发送一篇空帖子,然后它将是0你可以检查它是否>0,然后我将使用:hasBody=http.getContentLength()>-1,我想我可以发送一篇空帖子,然后它将是0。你可以检查它是否大于0,然后http.getContentLength()>-1就足够了。读取不是一个选项,因为这会破坏稍后在流中读取它的代码的功能。http.getContentLength()>-1就足够了。读取不是一个选项,因为这会破坏稍后在流中读取它的代码的功能。