2011-11-11 24 views
45

Próbuję pobrać całe ciało z obiektu HttpServletRequest.Uzyskaj treść żądania POST z HttpServletRequest

Kod śledzę wygląda następująco:

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(); 
} 

a ja testuje funkcjonalność z dyni i wget następująco:

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" 

Ale while ((bytesRead = bufferedReader.read(charBuffer)) != -1) nic nie wróci, a więc Nic nie jest dołączane do StringBuffer.

Odpowiedz

1

Jeśli próbujesz analizować i chcesz zarządzać przesyłaniem plików, użyj Commons FileUpload - obsługuje on wszystkie przetwarzanie danych, zarówno pola, jak i dane pliku.

FWIW, kod działa dla mnie tak jak-jest za pomocą dowolnego polecenia.

Co to jest cały serwlet i jego mapowanie?

Czy polecenia zostały wysłane przez literówki? Nie będą działać tak, jak są.

+0

Nie próbuję analizować/uchwyt wysyłania plików. Chcę uzyskać "treść żądania POST" w formacie String. –

+0

@patelbhavin Zastanów się nad usunięciem słowa "parsowanie" z tytułu pytania. –

+0

@patelbhavin Zobacz aktualizację. –

6

Jeśli treść żądania jest pusta, oznacza to po prostu, że została już wcześniej zużyta. Na przykład przez wywołanie request.getParameter(), getParameterValues() lub getParameterMap(). Po prostu usuń linie wykonujące te połączenia z twojego kodu.

+0

Działa to tylko wtedy, gdy nie jest to przesyłanie pliku, jak na przykład "curl", nie? –

+0

@Dave: Tak, słusznie, zredagowałem odpowiedź. – BalusC

+0

Próbowałem tego. Ale nadal nie otrzymuję ciała POST. Muszę czegoś przegapić. Wystarczy dodać: używam Tapestry dla rozwoju. –

18

Należy pamiętać, że kod jest dość głośny. Wiem, że wątek jest stary, ale wiele osób i tak to przeczyta. Można zrobić to samo przy użyciu biblioteki guava z:

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

Jeśli chcesz to ciało żądanie POST, można użyć metody takie jak to:

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

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

+1

Weź pod uwagę, że 'request.getInputStream()' nie honoruje kodowania znaków zapytania, ponieważ 'request.getReader()' ma. +1 za link. – Vadzim

+0

jaki powinien być odpowiednik metody PUT? – devanathan

3

działa to zarówno GET i 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 ""; 
} 
66

W języku Java 8 można to zrobić w prostszy i bardziej przejrzysty sposób:

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

Preferuję to rozwiązanie ze względu na to, że jest to czysta Java bez zależności od podmiotów trzecich. –

+7

Pamiętaj jednak, że nie możemy ponownie odczytać treści żądania, ponieważ 'getReader' został już wywołany. –

Powiązane problemy