2011-11-11 40 views
45

Tôi đang cố gắng lấy toàn bộ nội dung từ đối tượng HttpServletRequest.Tải nội dung yêu cầu POST từ HttpServletRequest

Mã này tôi sau trông như sau:

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

và tôi đang thử nghiệm các chức năng với curl và wget như sau:

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" 

Nhưng while ((bytesRead = bufferedReader.read(charBuffer)) != -1) không trả lại bất cứ điều gì, và vì vậy Tôi không nhận được gì thêm vào StringBuffer.

Trả lời

1

Nếu bạn đang cố gắng phân tích cú pháp và muốn xử lý các tệp tải lên, hãy sử dụng Commons FileUpload - nó xử lý tất cả phân tích cú pháp cho bạn, cả trường và dữ liệu tệp.

FWIW, mã hoạt động cho tôi khi đang sử dụng một trong hai lệnh.

Toàn bộ servlet và ánh xạ của nó là gì?

Các lệnh bạn đã đăng lỗi chính tả chưa? Chúng sẽ không hoạt động.

+0

Tôi không cố gắng để phân tích tập tin uploads/xử lý. Tôi muốn nhận được "POST request body" ở định dạng String. –

+0

@patelbhavin Cân nhắc xóa từ "phân tích cú pháp" khỏi tiêu đề câu hỏi của bạn. –

+0

@patelbhavin Xem cập nhật. –

6

Nếu nội dung yêu cầu trống, thì điều đó có nghĩa là nó đã được tiêu thụ trước đó. Ví dụ: bằng cách gọi số request.getParameter(), getParameterValues() hoặc getParameterMap(). Chỉ cần xóa các dòng đang thực hiện các cuộc gọi đó khỏi mã của bạn.

+0

Điều đó chỉ hoạt động nếu nó không phải là tệp tải lên, vì ví dụ 'curl' là, không? –

+0

@Dave: Vâng, điểm công bằng, tôi đã chỉnh sửa câu trả lời. – BalusC

+0

Tôi đã thử điều này. Nhưng tôi vẫn không nhận được cơ thể POST. Chắc chắn là tôi đang thiếu gì đó. Chỉ cần thêm vào: Tôi đang sử dụng Tapestry cho sự phát triển. –

18

Xin lưu ý rằng mã của bạn khá ồn ào. Tôi biết chủ đề cũ, nhưng nhiều người vẫn đọc nó. Bạn có thể làm điều tương tự bằng cách sử dụng thư viện guava với:

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

Nếu tất cả các bạn muốn là cơ quan yêu cầu POST, bạn có thể sử dụng một phương pháp như thế này:

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

tín dụng đối với: https://stackoverflow.com/a/5445161/1389219

+1

Hãy xem xét rằng 'request.getInputStream()' không tôn trọng mã hóa ký tự yêu cầu như 'request.getReader()'. +1 cho liên kết. – Vadzim

+0

phương pháp nào tương đương với phương pháp PUT? – devanathan

3

này làm việc cho cả hai GET và 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

Trong Java 8, bạn có thể làm điều đó một cách đơn giản và rõ ràng hơn:

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

Tôi thích giải pháp này vì nó là một Java thuần túy mà không có bất kỳ sự phụ thuộc của bên thứ 3 nào. –

+7

Mặc dù hãy nhớ rằng chúng tôi không thể đọc lại phần thân yêu cầu vì 'getReader' đã được gọi. –

Các vấn đề liên quan