Estou tentando obter o corpo inteiro do objeto HttpServletRequest.
O código que estou seguindo é assim:
if ( request.getMethod().equals("POST") )
{
StringBuffer sb = new StringBuffer();
BufferedReader bufferedReader = null;
String content = "";
try {
//InputStream inputStream = request.getInputStream();
//inputStream.available();
//if (inputStream != null) {
bufferedReader = request.getReader() ; //new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead;
while ( (bytesRead = bufferedReader.read(charBuffer)) != -1 ) {
sb.append(charBuffer, 0, bytesRead);
}
//} else {
// sb.append("");
//}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
test = sb.toString();
}
e estou testando a funcionalidade com curl e wget da seguinte maneira:
curl --header "MD5: abcd" -F "[email protected] http://localhost:8080/abcd.html"
wget --header="MD5: abcd" --post-data='{"imei":"351553012623446","hni":"310150","wdp":false}' http://localhost:8080/abcd.html"
Mas o while ( (bytesRead = bufferedReader.read(charBuffer)) != -1 )
não retorna nada e, portanto, não recebo nada anexado a StringBuffer.
getReader
já foi chamado.Maneira fácil com o commons-io.
https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/IOUtils.html
fonte
Esteja ciente de que seu código é muito barulhento. Eu sei que o tópico é antigo, mas muitas pessoas irão ler de qualquer maneira. Você poderia fazer a mesma coisa usando a biblioteca de goiaba com:
fonte
if(RequestMethod.POST.name().equalsIgnoreCase(...)) { ... }
Se tudo o que você deseja é o corpo da solicitação POST, você pode usar um método como este:
Crédito para: https://stackoverflow.com/a/5445161/1389219
fonte
request.getInputStream()
isso não respeita a codificação de caracteres da solicitação comorequest.getReader()
faz. 1 para o link embora.Isso funciona para GET e POST:
fonte
Se o corpo da solicitação estiver vazio, isso significa simplesmente que já foi consumido de antemão. Por exemplo, por um
request.getParameter()
,getParameterValues()
ougetParameterMap()
chamada. Apenas remova as linhas que fazem essas chamadas de seu código.fonte
curl
exemplo, não?Isso funcionará para todos os métodos HTTP.
fonte
Resolvi essa situação desta forma. Criei um método utilitário que retorna um objeto extraído do corpo da solicitação, usando o método readValue do ObjectMapper que é capaz de receber um Reader.
fonte