Подтвердить что ты не робот

Получение запроса полезной нагрузки из запроса POST в Java-сервлете

У меня есть библиотека javascript, которая отправляет запрос POST на мой Java-сервлет, но в методе doPost я не могу получить содержимое полезной нагрузки запроса. В Chrome Developer Tools все содержимое находится в разделе "Запросить полезную нагрузку" на вкладке "Заголовки", а содержимое есть, и я знаю, что POST принимается методом doPost, но он просто пуст.

Для HttpServletRequest объект, каким образом я могу получить данные в полезной нагрузке запроса?

Выполнение request.getParameter() или request.getAttributes() оба заканчиваются без данных

4b9b3361

Ответ 1

Простой ответ:
Используйте getReader(), чтобы прочитать тело запроса

Больше информации:
Есть два метода для чтения данных в теле:

  1. getReader() возвращает BufferedReader, который позволит вам прочитать тело запроса.

  2. 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);
        }
    }