logo

Чтение тела POST-запроса из HttpServletRequest в Java

Быстрый ответ

Чтобы получить доступ к содержанию POST-запроса через HttpServletRequest, используйте метод getReader(). Проходите по строкам, объединяя их в единую строку String:

Java
Скопировать код
StringBuilder body = new StringBuilder();
String line;
while ((line = request.getReader().readLine()) != null) {
    body.append(line);
}
String postBody = body.toString();

Не забудьте начать чтение как первую операцию с потоком: возможность повторного чтения отсутствует.

Подготовка к главной сцене

Прежде чем анализировать содержимое запроса, убедитесь, что это POST-запрос, используя request.getMethod():

Java
Скопировать код
if ("POST".equals(request.getMethod())) {
    // Теперь можно работать с содержимым запроса
}

Be courteous to BufferedReader by using the try-with-resources statement:

Тщательное обращение с BufferedReader обеспечивается с помощью конструкции try-with-resources:

Java
Скопировать код
try (BufferedReader reader = request.getReader()) {
    // Основная работа с ридером.
} catch (IOException e) {
    // Обрабатываем исключение IOException.
}

Если вы ищете более изящное решение, используйте потоки Java:

Java
Скопировать код
String requestBody = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));

Корректно обрабатывайте кодировку, предпочтительно UTF-8, и используйте утилиты curl и wget для тестирования.

Визуализация

Извлечение содержимого POST-запроса направлено на декодирование секретного послания:

Markdown
Скопировать код
📩 **Конверт (HttpServletRequest):** Открывает доступ к посланию (содержимому POST-запроса)
Java
Скопировать код
StringBuilder postData = new StringBuilder();
String line;
try (BufferedReader reader = request.getReader()) {
    while ((line = reader.readLine()) != null) {
        postData.append(line);
    }
} catch (Exception e) { /* Обрабатываем исключение */ }

String postDataText = postData.toString();

Последовательность:

Markdown
Скопировать код
📩 -> 📤 -> 💌

📩: Получение запроса (HTTPServletRequest)
📤: Начало извлечения данных
💌: Данные доступны для чтения

Применение секретных инструментов шпиона: Альтернативные методы и меры предосторожности

Упрощение работы со сканером

Использование Scanner – это ещё один способ чтения входящего потока:

Java
Скопировать код
Scanner s = new Scanner(request.getInputStream()).useDelimiter("\\A");
String requestBody = s.hasNext() ? s.next() : "";

Использование кодовых библиотек

Имеются полезные сторонние библиотеки:

Для поклонников Apache Commons IO:

Java
Скопировать код
String requestBody = IOUtils.toString(request.getReader());

Для любителей Guava:

Java
Скопировать код
String requestBody = CharStreams.toString(request.getReader());

Обработка ошибок и защита от потенциальных препятствий

Чтобы защититься от повторного чтения и пустых тел запросов, проверьте, не было ли содержимое прочитано ранее, и проверьте заголовок Content-Type.

Извлечение параметров и заголовков:

Java
Скопировать код
while (httpRequest.getParameterNames().hasMoreElements()) {
    // Здесь находятся параметры
}

while (httpRequest.getHeaderNames().hasMoreElements()) {
    // Здесь расположены заголовки
}

Безопасность при многопоточной работе: Умение играть в песочницу

Обеспечьте безопасность чтения содержимого запроса в многопоточной среде, предотвратив одновременный доступ к HttpServletRequest.

Полезные материалы

  1. ServletRequest (Java(TM) EE 7 Specification APIs)Официальная документация Java EE 7.
  2. Получение содержимого POST-запроса в Java servlet – Stack Overflow — Обсуждение на Stack Overflow.
  3. HttpServletRequest (Java(TM) EE 8 Specification APIs)Обновлённое руководство по HttpServletRequest.
  4. Servlets – Данные формыПримеры кода и объяснение работы с формами в сервлетах.
  5. Commons IO – Обзор библиотеки Commons IO — Библиотека для работы с IO.
  6. java – Получение содержимого POST-запроса из HttpServletRequest – Stack Overflow — Обсуждение на Stack Overflow со многими примерами извлечения содержимого запроса.