我正在尝试在Java中获取帖子数据。看起来这应该是最简单的事情之一,对吧?我的意思是,HttpServletRequest.getParameter必须做得对吧?那么你如何获取原始的帖子数据呢?
我发现了HttpServletRequest get JSON POST data并使用了Kdeveloper的代码从请求中提取了帖子数据。它有效,但有一个问题:我只能获取那个帖子数据一次。
这是我从Kdeveloper的代码制作的方法:
public static String getPostData(HttpServletRequest req) {
StringBuilder sb = new StringBuilder();
try {
BufferedReader reader = req.getReader();
reader.mark(10000);
String line;
do {
line = reader.readLine();
sb.append(line).append("\n");
} while (line != null);
reader.reset();
// do NOT close the reader here, or you won't be able to get the post data twice
} catch(IOException e) {
logger.warn("getPostData couldn't.. get the post data", e); // This has happened if the request's reader is closed
}
return sb.toString();
}
之前我在这个方法的末尾关闭了reader,但当该方法在同一请求上运行多次时,会导致异常。不关闭它就不会发生异常,但是该方法返回一个空字符串。
说实话,应该有一个公开的req.getPostData()方法 - 没有人认为这很有用吗?
那么我该如何编写此方法以始终返回正确的post数据?
getParameter()
时,HttpServletRequest
将内部使用getInputStream()
读取和解析请求体(它是来自网络连接的字节流),并将其存储在一个映射中,您可以通过getParameterMap()
获取该映射。此后,您无法再通过getInputStream()
/getReader()
读取请求体,因为它已经被读取。如果您需要更清楚地了解这个需求背后的功能要求,那么我们可能能够建议更好的实现方式。 - BalusCHttpServletRequestWrapper
,它包含一个ByteArrayInputStream
来保存请求体的副本。 - BalusC