recibir - json java servlet jquery
Obtener el cuerpo de solicitud POST de HttpServletRequest (7)
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()));
}
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 "[email protected] 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.
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 "";
}
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.
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.
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://.com/a/5445161/1389219
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 guava con:
if ("POST".equalsIgnoreCase(request.getMethod())) {
test = CharStreams.toString(request.getReader());
}