У меня есть библиотека javascript, которая отправляет запрос POST на мой Java-сервлет, но в методе doPost
я не могу получить содержимое полезной нагрузки запроса. В Chrome Developer Tools все содержимое находится в разделе "Запросить полезную нагрузку" на вкладке "Заголовки", а содержимое есть, и я знаю, что POST принимается методом doPost, но он просто пуст.
Для HttpServletRequest
объект, каким образом я могу получить данные в полезной нагрузке запроса?
Выполнение request.getParameter()
или request.getAttributes()
оба заканчиваются без данных
Ответ 1
Простой ответ:
Используйте getReader(), чтобы прочитать тело запроса
Больше информации:
Есть два метода для чтения данных в теле:
-
getReader()
возвращает BufferedReader, который позволит вам прочитать тело запроса.
-
getInputStream()
возвращает ServletInputStream, если вам нужно прочитать двоичные данные.
Примечание из документации: "[Любой метод] может быть вызван для чтения тела, а не обоих".
Ответ 2
String payloadRequest = getBody(request);
Используя этот метод
public static String getBody(HttpServletRequest request) throws IOException {
String body = null;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
return body;
}
Ответ 3
Вы можете использовать Buffer Reader из запроса для чтения
// Read from request
StringBuilder buffer = new StringBuilder();
BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
String data = buffer.toString()
Ответ 4
Java 8 потоков
String body = request.getReader().lines()
.reduce("", (accumulator, actual) -> accumulator + actual);
Ответ 5
С Apache Commons IO вы можете сделать это в одной строке.
IOUtils.toString(request.getReader())
Ответ 6
Если содержимое тела является строкой в Java 8, вы можете сделать:
String body = request.getReader().lines().collect(Collectors.joining());
Ответ 7
Если вы можете отправить полезную нагрузку в JSON, это самый удобный способ прочитать загрузочную загрузку:
Пример класса данных:
public class Person {
String firstName;
String lastName;
// Getters and setters ...
}
Пример полезной нагрузки (тело запроса):
{ "firstName" : "John", "lastName" : "Doe" }
Код для чтения полезной нагрузки в сервлет (требуется com.google.gson. *):
Person person = new Gson().fromJson(request.getReader(), Person.class);
Все это. Хороший, легкий и чистый. Не забудьте установить заголовок содержимого в application/json.
Ответ 8
Вам нужно только
request.getParameterMap()
для получения параметров POST и GET.
Возвращает метод Map<String,String[]>
.
Вы можете прочитать параметры на карте с помощью
Map<String, String[]> map = request.getParameterMap();
//Reading the Map
//Works for GET && POST Method
for(String paramName:map.keySet()) {
String[] paramValues = map.get(paramName);
//Get Values of Param Name
for(String valueOfParam:paramValues) {
//Output the Values
System.out.println("Value of Param with Name "+paramName+": "+valueOfParam);
}
}
Ответ 9
Использование Java 8 с ресурсами:
StringBuilder stringBuilder = new StringBuilder();
try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()))) {
char[] charBuffer = new char[1024];
int bytesRead;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
}