У меня есть библиотека javascript, которая отправляет запрос POST на мой сервлет Java, но в этом doPost
методе я не могу получить содержимое полезной нагрузки запроса. В Chrome Developer Tools весь контент находится в разделе Request Payload на вкладке заголовков, и контент там, и я знаю, что POST получает метод doPost, но он просто пустой.
HttpServletRequest
Как я могу получить данные в полезных данных запроса для объекта?
Действие request.getParameter()
или request.getAttributes()
оба заканчиваются без данных
Ответы:
Простой ответ:
используйте getReader (), чтобы прочитать тело запроса.
Подробнее:
Есть два метода чтения данных в теле:
getReader()
возвращает BufferedReader , который позволит вам прочитать тело запроса.getInputStream()
возвращает ServletInputStream, если вам нужно прочитать двоичные данные.Примечание из документации: «[Любой метод] может быть вызван для чтения тела, но не оба».
источник
Используя этот метод
источник
request.getInputStream()
кодировка символов запроса не соблюдается, как этоrequest.getReader()
делает. Итак, в этом примере используется системная кодировка по умолчанию.new BufferedReader(new InputStreamReader(request.getInputStream()))
можно упростить до того,request.getReader()
что он уже буферизован, а также сохраняет кодировку запроса.javax.servlet.ServletException: java.lang.IllegalStateException: getInputStream() has already been called for this request
когда я вызвал getReader () в результате того, что читатель уже был открыт.Вы можете использовать Buffer Reader из запроса на чтение
источник
Потоки Java 8
источник
(accumulator, actual) -> accumulator + actual
наString::concat
.С Apache Commons IO вы можете сделать это одной строкой.
источник
Если содержимое тела является строкой в Java 8, вы можете сделать:
String body = request.getReader().lines().collect(Collectors.joining());
источник
Если вы можете отправить полезную нагрузку в формате JSON, это наиболее удобный способ прочитать ее:
Пример класса данных:
Пример полезной нагрузки (тело запроса):
Код для чтения полезной нагрузки в сервлете (требуется com.google.gson. *):
Вот и все. Красиво, легко и чисто. Не забудьте установить заголовок content-type в application / json.
источник
Используя Java 8, попробуйте использовать ресурсы:
источник
Вам нужно только
для получения POST и GET - параметров.
Метод возвращает
Map<String,String[]>
.Вы можете прочитать параметры на карте по
источник
application/x-www-form-urlencoded
; посколькуmultipart/form-data
вам, очевидно, нужно получить доступ к части телаrequest.getReader()
и проанализировать ее вручную.