Servlets 如何检测HttpServletRequest是否有正文?
我试图检测一个http请求是否有正文,而不读取它或做任何使现有代码无法处理它的事情,不管它在流中稍后做什么Servlets 如何检测HttpServletRequest是否有正文?,servlets,Servlets,我试图检测一个http请求是否有正文,而不读取它或做任何使现有代码无法处理它的事情,不管它在流中稍后做什么 boolean hasBody(HttpServletRequest http) { boolean hasBody = false; try { hasBody = http.getInputStream() != null; // always gives true hasBody = http.getReader().ready();
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就足够了。读取不是一个选项,因为这会破坏稍后在流中读取它的代码的功能。