Obtener la carga útil de solicitud de la solicitud POST en el servlet de Java

Tengo una biblioteca de JavaScript que está enviando una solicitud POST a mi servlet Java, pero en el método doPost , parece que no puedo obtener el contenido de la carga útil de la solicitud. En Herramientas para desarrolladores de Chrome, todo el contenido está en la sección Solicitar carga útil en la pestaña de encabezados, y el contenido está allí, y sé que el método doPost está recibiendo el POST, pero simplemente aparece en blanco.

Para el objeto HttpServletRequest , ¿de qué manera puedo obtener los datos en la carga útil de la solicitud?

Hacer request.getParameter() o request.getAttributes() ambos terminan sin datos

Use getReader() para leer el cuerpo de la solicitud

 String payloadRequest = getBody(request); 

Usando este método

 public static String getBody(HttpServletRequest request) throws IOException { String body = null; StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = null; try { InputStream inputStream = request.getInputStream(); if (inputStream != null) { bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); char[] charBuffer = new char[128]; int bytesRead = -1; while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { stringBuilder.append(charBuffer, 0, bytesRead); } } else { stringBuilder.append(""); } } catch (IOException ex) { throw ex; } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException ex) { throw ex; } } } body = stringBuilder.toString(); return body; } 

Puede usar Buffer Reader de solicitud para leer

  // Read from request StringBuilder buffer = new StringBuilder(); BufferedReader reader = request.getReader(); String line; while ((line = reader.readLine()) != null) { buffer.append(line); } String data = buffer.toString() 

Corrientes de Java 8

 String body = request.getReader().lines() .reduce("", (accumulator, actual) -> accumulator + actual); 

Con Apache Commons IO puedes hacer esto en una línea.

 IOUtils.toString(request.getReader()) 

Si el contenido del cuerpo es una cadena en Java 8, puede hacer:

String body = request.getReader().lines().collect(Collectors.joining());

Usando Java 8 prueba con los recursos:

  StringBuilder stringBuilder = new StringBuilder(); try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()))) { char[] charBuffer = new char[1024]; int bytesRead; while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { stringBuilder.append(charBuffer, 0, bytesRead); } } 

Solo necesitas

request.getParameterMap ()

para obtener POST y GET – Parámetros.

El método devuelve un Map .

Puede leer los parámetros en el Mapa por

 Map map = request.getParameterMap(); //Reading the Map //Works for GET && POST Method for(String paramName:map.keySet()) { String[] paramValues = map.get(paramName); //Get Values of Param Name for(String valueOfParam:paramValues) { //Output the Values System.out.println("Value of Param with Name "+paramName+": "+valueOfParam); } } 

Si puede enviar la carga útil en JSON, esta es la forma más conveniente de leer la carga de juego:

Ejemplo de clase de datos:

 public class Person { String firstName; String lastName; // Getters and setters ... } 

Ejemplo de carga útil (cuerpo de la solicitud):

 { "firstName" : "John", "lastName" : "Doe" } 

Código para leer la carga útil en servlet (requiere com.google.gson. *):

 Person person = new Gson().fromJson(request.getReader(), Person.class); 

Eso es todo. Agradable, fácil y limpio. No olvides configurar el encabezado del tipo de contenido en application / json.