2009-05-13 26 views
11

Đang cố gắng để có được các thông số từ một yêu cầu PUT sử dụng HttpServlet # doPut:thông số Servlet và doPut

public void doPut(HttpServletRequest request, HttpServletResponse response) { 
    String name = request.getParameter("name"); 
    // name is null 
} 

Sử dụng curl để gửi yêu cầu:

curl -X PUT \ 
     --data "name=batman" \ 
     --header "Content-Type: text/plain" http://localhost:8080/sample.html 

hoạt động tốt với việc sử dụng doGet và GET yêu cầu curl . Tui bỏ lỡ điều gì vậy?

Trả lời

20

Dựa trên các nhận xét và nghiên cứu sâu hơn Tôi nhận thấy Servlet không thể giả định bất kỳ thứ gì về dữ liệu được đặt lên máy chủ.

Giải pháp sau đây có vẻ là cách thích hợp để xử lý bất kỳ dữ liệu nào được truyền qua PUT và có thể được phân tích cú pháp dưới dạng XML, Tên/Giá trị hoặc bất kỳ thứ gì.

BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()); 

String data = br.readLine(); 
+0

Tại sao bạn đang cố gắng sử dụng nó theo cách nó không có ý nghĩa? Tuy nhiên bạn có thể chơi xung quanh với những điều như bạn vui lòng. –

+4

Tôi đang chạy vào cùng một vấn đề: Tôi đang cố gắng triển khai một dịch vụ hoàn toàn, PUT có nghĩa là thay thế tài nguyên. Jetty làm cho tất cả dữ liệu có sẵn trong bản đồ tham số yêu cầu, tuy nhiên, tomcat không .. – Andrej

+0

Theo Java Web Services: Up and Running, doPost và doPut khác nhau đáng kể vì thời gian chạy servlet container không tạo ra một bản đồ tham số có thể sử dụng được. là trường hợp trong cả Tomcat và Jetty) " – Jason

1

Ý bạn là gì bởi doPut() không hoạt động? Theo tôi biết, nó không hoạt động như doGet() hoặc doPost(), nơi bạn có thông số và nội dung yêu cầu.

PUT có thể được sử dụng để đặt thứ gì đó lên máy chủ. Đặc biệt, thao tác PUT cho phép một khách hàng đặt một tệp trên máy chủ và tương tự như gửi một tệp bằng FTP. Hãy xem ví dụ này, tôi tìm thấy trên JGuru.

->GET /file.dat HTTP/1.1 

<-HTTP/1.1 404 Not Found 

->PUT /file.dat HTTP/1.1 
Content-Length: 6 
Content-Type: text/plain 

Hello! 

<-HTTP/1.1 200 OK 

->GET /file.dat HTTP/1.1 

<-HTTP/1.1 200 OK 
Content-Length: 6 
Content-Type: text/plain 

Hello! 
0

Không giống như trong doGet()doPost() phương pháp, chúng tôi không thể nhận được các thông số yêu cầu sử dụng phương pháp getParameter() trong doPut()doDelete() phương pháp. Chúng tôi cần truy xuất chúng theo cách thủ công từ luồng đầu vào.

Các phương pháp sau đây lấy thông số yêu cầu và trả cho họ trong một bản đồ:

public static Map<String, String> getParameterMap(HttpServletRequest request) { 

    BufferedReader br = null; 
    Map<String, String> dataMap = null; 

    try { 

     InputStreamReader reader = new InputStreamReader(
       request.getInputStream()); 
     br = new BufferedReader(reader); 

     String data = br.readLine(); 

     dataMap = Splitter.on('&') 
       .trimResults() 
       .withKeyValueSeparator(
         Splitter.on('=') 
         .limit(2) 
         .trimResults()) 
       .split(data); 

     return dataMap; 
    } catch (IOException ex) { 
     Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(Utils.class.getName()).log(Level.WARNING, null, ex); 
      } 
     } 
    } 

    return dataMap; 
} 

Ví dụ sử dụng thư viện ổi của Google để phân tích các thông số. Để có ví dụ hoàn chỉnh chứa các phương thức doGet(), doPost(), doPut()doDelete(), bạn có thể đọc Using jsGrid tutorial của mình.

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