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.