Obtener el cuerpo de solicitud POST de HttpServletRequest

Estoy tratando de obtener todo el cuerpo del objeto HttpServletRequest.

El código que estoy siguiendo se ve así:

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(); } 

y estoy probando la funcionalidad con curl y wget de la siguiente manera:

 curl --header "MD5: abcd" -F "fileupload=@filename.txt http://localhost:8080/abcd.html" wget --header="MD5: abcd" --post-data='{"imei":"351553012623446","hni":"310150","wdp":false}' http://localhost:8080/abcd.html" 

Pero el while ( (bytesRead = bufferedReader.read(charBuffer)) != -1 ) no devuelve nada, por lo que no se agrega nada en StringBuffer.

En Java 8, puede hacerlo de una manera más simple y limpia:

 if ("POST".equalsIgnoreCase(request.getMethod())) { test = req.getReader().lines().collect(Collectors.joining(System.lineSeparator())); } 

Tenga en cuenta que su código es bastante ruidoso. Sé que el hilo es viejo, pero mucha gente lo leerá de todos modos. Puedes hacer lo mismo usando la biblioteca de guayaba con:

  if ("POST".equalsIgnoreCase(request.getMethod())) { test = CharStreams.toString(request.getReader()); } 

Si todo lo que desea es el cuerpo de la solicitud POST, puede usar un método como este:

 static String extractPostRequestBody(HttpServletRequest request) throws IOException { if ("POST".equalsIgnoreCase(request.getMethod())) { Scanner s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } return ""; } 

Crédito a: https://stackoverflow.com/a/5445161/1389219

Manera fácil con commons-io.

 IOUtils.toString(request.getReader()); 

https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/IOUtils.html

Si el cuerpo de la solicitud está vacío, simplemente significa que ya se ha consumido de antemano. Por ejemplo, mediante una llamada a request.getParameter() , getParameterValues() o getParameterMap() . Solo elimine las líneas que hacen esas llamadas desde su código.

Esto funciona tanto para GET como para POST:

 @Context private HttpServletRequest httpRequest; private void printRequest(HttpServletRequest httpRequest) { System.out.println(" \n\n Headers"); Enumeration headerNames = httpRequest.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = (String)headerNames.nextElement(); System.out.println(headerName + " = " + httpRequest.getHeader(headerName)); } System.out.println("\n\nParameters"); Enumeration params = httpRequest.getParameterNames(); while(params.hasMoreElements()){ String paramName = (String)params.nextElement(); System.out.println(paramName + " = " + httpRequest.getParameter(paramName)); } System.out.println("\n\n Row data"); System.out.println(extractPostRequestBody(httpRequest)); } static String extractPostRequestBody(HttpServletRequest request) { if ("POST".equalsIgnoreCase(request.getMethod())) { Scanner s = null; try { s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A"); } catch (IOException e) { e.printStackTrace(); } return s.hasNext() ? s.next() : ""; } return ""; } 

Si está tratando de analizar y desea manejar las cargas de archivos, use Commons FileUpload , que maneja todo el análisis, tanto campos como datos de archivos.

FWIW, el código funciona para mí como está usando cualquiera de los comandos.

¿Qué es todo el servlet y su mapeo?

Son los comandos que publica errores tipográficos? No funcionarán como están.