我正在尝试获取Java中的发布数据。好像应该做的最简单的事情之一?我的意思是,HttpServletRequest.getParameter必须正确执行吗?那么如何获取原始帖子数据?
我发现HttpServletRequest get JSON POST data,并使用Kdeveloper的代码从请求中提取帖子数据。它有效,但有一个陷阱:我只能得到该帖子数据once。
这里是我用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();
}
以前,我在此方法结束时关闭了读取器,但是当该方法在同一请求上多次运行时,这会导致异常。如果不关闭它,则不会发生任何异常,但是该方法将返回一个空字符串。
老实说,应该只有一个公开的req.getPostData()方法-没有人认为这会有用吗?
因此,我如何编写此方法以使其始终返回正确的发布数据?
请求正文可通过HttpServletRequest#getInputStream()
和HttpServletRequest#getInputStream()
获得。
#getReader()
请注意,您只能阅读一次。客户端不会多次重发它。调用#getReader()
等将隐式读取它。您必须将尸体存放在某个地方并自行处理。
我们遇到了IE迫使我们将其发布为文本/纯文本的情况,因此我们不得不使用getReader手动解析参数。该Servlet用于长时间轮询,因此,在延迟后执行AsyncContext :: dispatch时,它实际上是空手重新发送请求。
因此,我只是使用HttpServletRequest :: setAttribute在请求首次出现时将其存储在请求中。 getReader方法清空缓冲区,而getParameter也清空缓冲区,但会自动存储参数。
InputStream body = request.getInputStream();
// ...
这对我有用:(注意需要Java 8)
getParameter()
UserJsonParse是一个类,向gson显示如何解析json共振峰。
类是这样的:
String input = null;
// we have to store the string, which can only be read one time, because when the
// servlet awakens an AsyncContext, it reposts the request and returns here empty handed
if ((input = (String) request.getAttribute("com.xp.input")) == null) {
StringBuilder buffer = new StringBuilder();
BufferedReader reader = request.getReader();
String line;
while((line = reader.readLine()) != null){
buffer.append(line);
}
// reqBytes = buffer.toString().getBytes();
input = buffer.toString();
request.setAttribute("com.xp.input", input);
}
if (input == null) {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.print("{\"act\":\"fail\",\"msg\":\"invalid\"}");
}
解析的json字符串就像这样:
String requestData = request.getReader().lines().collect(Collectors.joining());
UserJsonParser u = gson.fromJson(requestData, UserJsonParser.class);
其余值(邮件,姓氏,名称)设置为空