Eu tenho uma biblioteca javascript que está enviando uma solicitação POST para meu servlet Java, mas no doPost
método, não consigo obter o conteúdo da carga útil da solicitação. No Chrome Developer Tools, todo o conteúdo está na seção Request Payload na guia headers, e o conteúdo está lá, e eu sei que o POST está sendo recebido pelo método doPost, mas só fica em branco.
Para o HttpServletRequest
objeto, como posso obter os dados na carga útil da solicitação?
Fazer request.getParameter()
ou request.getAttributes()
ambos acabam sem dados
Respostas:
Resposta simples:
use getReader () para ler o corpo da solicitação
Mais informações:
Existem dois métodos para ler os dados no corpo:
getReader()
retorna um BufferedReader que permitirá que você leia o corpo da solicitação.getInputStream()
retorna um ServletInputStream se você precisar ler dados binários.Observação dos documentos: "[Qualquer método] pode ser chamado para ler o corpo, não ambos."
fonte
Usando este método
fonte
request.getInputStream()
isso não respeita a codificação de caracteres da solicitação como orequest.getReader()
faz. Portanto, este exemplo usa o conjunto de caracteres do sistema padrão.new BufferedReader(new InputStreamReader(request.getInputStream()))
poderia ser simplificado pararequest.getReader()
que já esteja armazenado em buffer e também preserva a codificação da solicitação.javax.servlet.ServletException: java.lang.IllegalStateException: getInputStream() has already been called for this request
quando chamei getReader () como resultado do leitor já estar aberto.Você pode usar o Buffer Reader desde a solicitação até a leitura
fonte
Streams Java 8
fonte
(accumulator, actual) -> accumulator + actual
porString::concat
.Com o Apache Commons IO, você pode fazer isso em uma linha.
fonte
Se o conteúdo do corpo for uma string em Java 8, você pode fazer:
String body = request.getReader().lines().collect(Collectors.joining());
fonte
Se você puder enviar o payload em JSON, esta é a maneira mais conveniente de ler o playload:
Classe de dados de exemplo:
Carga útil de exemplo (corpo da solicitação):
Código para ler a carga útil no servlet (requer com.google.gson. *):
Isso é tudo. Bom, fácil e limpo. Não se esqueça de definir o cabeçalho do tipo de conteúdo para application / json.
fonte
Usando o Java 8, tente com recursos:
fonte
Você só precisa
para obter os parâmetros POST e GET.
O método retorna a
Map<String,String[]>
.Você pode ler os parâmetros no mapa por
fonte
application/x-www-form-urlencoded
; poismultipart/form-data
, aparentemente, você precisa acessar a parte do corporequest.getReader()
e analisá-la manualmente.