Чтение тела POST-запроса из HttpServletRequest в Java
Быстрый ответ
Чтобы получить доступ к содержанию POST-запроса через HttpServletRequest
, используйте метод getReader()
. Проходите по строкам, объединяя их в единую строку String
:
StringBuilder body = new StringBuilder();
String line;
while ((line = request.getReader().readLine()) != null) {
body.append(line);
}
String postBody = body.toString();
Не забудьте начать чтение как первую операцию с потоком: возможность повторного чтения отсутствует.
Подготовка к главной сцене
Прежде чем анализировать содержимое запроса, убедитесь, что это POST-запрос, используя request.getMethod()
:
if ("POST".equals(request.getMethod())) {
// Теперь можно работать с содержимым запроса
}
Be courteous to BufferedReader
by using the try-with-resources statement:
Тщательное обращение с BufferedReader
обеспечивается с помощью конструкции try-with-resources:
try (BufferedReader reader = request.getReader()) {
// Основная работа с ридером.
} catch (IOException e) {
// Обрабатываем исключение IOException.
}
Если вы ищете более изящное решение, используйте потоки Java:
String requestBody = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
Корректно обрабатывайте кодировку, предпочтительно UTF-8, и используйте утилиты curl и wget для тестирования.
Визуализация
Извлечение содержимого POST-запроса направлено на декодирование секретного послания:
📩 **Конверт (HttpServletRequest):** Открывает доступ к посланию (содержимому POST-запроса)
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();
Последовательность:
📩 -> 📤 -> 💌
📩: Получение запроса (HTTPServletRequest)
📤: Начало извлечения данных
💌: Данные доступны для чтения
Применение секретных инструментов шпиона: Альтернативные методы и меры предосторожности
Упрощение работы со сканером
Использование Scanner
– это ещё один способ чтения входящего потока:
Scanner s = new Scanner(request.getInputStream()).useDelimiter("\\A");
String requestBody = s.hasNext() ? s.next() : "";
Использование кодовых библиотек
Имеются полезные сторонние библиотеки:
Для поклонников Apache Commons IO:
String requestBody = IOUtils.toString(request.getReader());
Для любителей Guava:
String requestBody = CharStreams.toString(request.getReader());
Обработка ошибок и защита от потенциальных препятствий
Чтобы защититься от повторного чтения и пустых тел запросов, проверьте, не было ли содержимое прочитано ранее, и проверьте заголовок Content-Type
.
Навигация по джунглям параметров и заголовков
Извлечение параметров и заголовков:
while (httpRequest.getParameterNames().hasMoreElements()) {
// Здесь находятся параметры
}
while (httpRequest.getHeaderNames().hasMoreElements()) {
// Здесь расположены заголовки
}
Безопасность при многопоточной работе: Умение играть в песочницу
Обеспечьте безопасность чтения содержимого запроса в многопоточной среде, предотвратив одновременный доступ к HttpServletRequest
.
Полезные материалы
- ServletRequest (Java(TM) EE 7 Specification APIs) — Официальная документация Java EE 7.
- Получение содержимого POST-запроса в Java servlet – Stack Overflow — Обсуждение на Stack Overflow.
- HttpServletRequest (Java(TM) EE 8 Specification APIs) — Обновлённое руководство по HttpServletRequest.
- Servlets – Данные формы — Примеры кода и объяснение работы с формами в сервлетах.
- Commons IO – Обзор библиотеки Commons IO — Библиотека для работы с IO.
- java – Получение содержимого POST-запроса из HttpServletRequest – Stack Overflow — Обсуждение на Stack Overflow со многими примерами извлечения содержимого запроса.