Как получить исходные данные из HttpServletRequest в java
Я пытаюсь получить данные post на Java. Похоже, это должно быть одной из самых простых вещей, чтобы сделать правильно? Я имею в виду, что HttpServletRequest.getParameter должен делать это правильно? Итак, как вы можете получить исходные данные?
Я нашел HttpServletRequest получить данные JSON POST и использовал код Kdeveloper, чтобы вытащить данные сообщения из запроса. Он работает, но theres catch: я могу получить только данные после этого.
Вот метод, который я сделал из кода 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 reader is closed
}
return sb.toString();
}
Раньше я закрывал читателя в конце этого метода, но это вызывало исключения, когда метод запускался более одного раза с тем же запросом. Без его закрытия никаких исключений не происходит, но метод возвращает пустую строку.
Честно говоря, должен быть только открытый метод req.getPostData() - никто не думал, что это будет полезно?
Итак, как я могу написать этот метод, чтобы он всегда возвращал правильные данные сообщения?
Ответы
Ответ 1
Тело запроса доступно HttpServletRequest#getInputStream()
и #getReader()
.
InputStream body = request.getInputStream();
// ...
Обратите внимание, что вы можете прочитать его только один раз. Клиент не будет повторно отправлять его несколько раз. Вызов getParameter()
и т.д. Неявно также прочитает его. Вы должны где-то хранить тело и обрабатывать себя.
Ответ 2
У нас была ситуация, когда IE заставлял нас публиковать текст как текст /plain, поэтому нам пришлось вручную анализировать параметры с помощью getReader. Сервлет использовался для длительного опроса, поэтому, когда AsyncContext:: dispatch был выполнен после задержки, он буквально перепрограммировал запрос с пустыми руками.
Поэтому я просто сохранил сообщение в запросе, когда он впервые появился с помощью HttpServletRequest:: setAttribute. Метод getReader освобождает буфер, где getParameter также освобождает буфер, но автоматически сохраняет параметры.
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\"}");
}