Ottieni il corpo della richiesta POST da HttpServletRequest

Sto cercando di ottenere l’intero corpo dall’object HttpServletRequest.

Il codice che sto seguendo assomiglia a questo:

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 sto testando la funzionalità con curl e wget come segue:

 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" 

Ma il while ( (bytesRead = bufferedReader.read(charBuffer)) != -1 ) non restituisce nulla, e quindi non ho aggiunto niente su StringBuffer.

In Java 8, puoi farlo in un modo più semplice e pulito:

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

Tieni presente che il tuo codice è abbastanza rumoroso. So che il filo è vecchio, ma molte persone lo leggeranno comunque. Puoi fare la stessa cosa usando la libreria guava con:

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

Se tutto ciò che si desidera è il corpo della richiesta POST, è ansible utilizzare un metodo come questo:

 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 ""; } 

Credito a: https://stackoverflow.com/a/5445161/1389219

Modo semplice con Commons-io.

 IOUtils.toString(request.getReader()); 

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

Se il corpo della richiesta è vuoto, significa semplicemente che è già stato consumato in anticipo. Ad esempio, con una request.getParameter() , getParameterValues() o getParameterMap() . Basta rimuovere le linee che fanno quelle chiamate dal tuo codice.

Funziona sia per GET che per 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 ""; } 

Se stai cercando di analizzare e vuoi gestire i caricamenti dei file, utilizza Commons FileUpload : gestisce tutto l’analisi per te, sia per i campi che per i dati dei file.

FWIW, il codice funziona per me come-sta usando entrambi i comandi.

Qual è l’intero servlet e la sua mapping?

I comandi che hai postato sono errori di battitura? Non funzioneranno così come sono.