Tengo una biblioteca de JavaScript que envía una solicitud POST a mi servlet de Java, pero en el doPost
método, parece que no puedo obtener el contenido de la carga útil de la solicitud. En Chrome Developer Tools, todo el contenido está en la sección Request Payload 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 HttpServletRequest
objeto, ¿de qué manera puedo obtener los datos en la carga útil de la solicitud?
Haciendo request.getParameter()
o request.getAttributes()
ambos terminan sin datos
Respuestas:
Respuesta simple:
use getReader () para leer el cuerpo de la solicitud
Más información:
Hay dos métodos para leer los datos en el cuerpo:
getReader()
devuelve un BufferedReader que le permitirá leer el cuerpo de la solicitud.getInputStream()
devuelve un ServletInputStream si necesita leer datos binarios.Nota de los documentos: "[Cualquier método] puede ser llamado para leer el cuerpo, no ambos".
fuente
Usando este método
fuente
request.getInputStream()
no respeta la codificación de caracteres de solicitud como lorequest.getReader()
hace. Entonces, este ejemplo usa el juego de caracteres predeterminado del sistema.new BufferedReader(new InputStreamReader(request.getInputStream()))
podría simplificarse arequest.getReader()
que ya está almacenado en búfer y también conserva la codificación de solicitud.javax.servlet.ServletException: java.lang.IllegalStateException: getInputStream() has already been called for this request
cuando llamé a getReader () como resultado de que el lector ya estaba abierto.Puede usar Buffer Reader desde la solicitud para leer
fuente
Flujos de Java 8
fuente
(accumulator, actual) -> accumulator + actual
conString::concat
.Con Apache Commons IO puede hacer esto en una línea.
fuente
Si el contenido del cuerpo es una cadena en Java 8, puede hacer:
String body = request.getReader().lines().collect(Collectors.joining());
fuente
Si puede enviar la carga útil en JSON, esta es la forma más conveniente de leer la carga de reproducción:
Clase de datos de ejemplo:
Carga útil de ejemplo (cuerpo de la solicitud):
Código para leer la carga útil en el servlet (requiere com.google.gson. *):
Eso es todo. Agradable, fácil y limpio. No olvide configurar el encabezado de tipo de contenido en application / json.
fuente
Usando Java 8 intente con recursos:
fuente
Solo necesitas
para obtener los parámetros POST y GET.
El método devuelve un
Map<String,String[]>
.Puede leer los parámetros en el mapa por
fuente
application/x-www-form-urlencoded
; ya quemultipart/form-data
, aparentemente, necesita acceder a la parte del cuerporequest.getReader()
y analizarla manualmente.