2010-10-21 29 views
16

Tôi đang cố gắng thực hiện một yêu cầu POST với một tập hợp các tham số cho một URL nhất định. Vấn đề tôi gặp phải là yêu cầu POST được thực hiện, nhưng không có tham số nào được chuyển.Thực hiện các yêu cầu POST với các tham số trong GWT

RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, url); 

    StringBuilder sb = new StringBuilder(); 
    for (String k: parmsRequest.keySet()) { 
     String vx = URL.encodeComponent(parmsRequest.get(k)); 
     if (sb.length() > 0) { 
      sb.append("&"); 
     } 
     sb.append(k).append("=").append(vx); 
    } 

    try { 
     Request response = builder.sendRequest(sb.toString(), new RequestCallback() { 

      public void onError(Request request, Throwable exception) {} 

      public void onResponseReceived(Request request, Response response) {} 
     }); 
    } catch (RequestException e) {} 
} 

này chỉ hoạt động tốt nếu tôi sử dụng chế độ GET và tự thêm các chuỗi truy vấn để yêu cầu - nhưng tôi cần phải sử dụng POST như là dữ liệu được thông qua cùng có thể lớn ....

Trả lời

24

Set tiêu đề yêu cầu của bạn:

builder.setHeader("Content-type", "application/x-www-form-urlencoded"); 
+1

Cảm ơn! Servlet chấp nhận của tôi đã không làm việc mà không .... không bao giờ có thể nghĩ về điều đó! Cảm ơn! – Lenz

+0

Vui vì tôi có thể giúp! – z00bs

0

Không thể sử dụng biểu mẫu web để gửi yêu cầu đến trang sử dụng kết hợp GET và POST. Nếu bạn đặt phương thức của biểu mẫu là GET, tất cả các tham số nằm trong chuỗi truy vấn. Nếu bạn đặt phương thức của biểu mẫu thành POST, tất cả các tham số đều nằm trong phần thân yêu cầu.

Nguồn: Tiêu chuẩn HTML 4.01, phần 17.13 Mẫu thông url: http://www.w3.org/TR/html4/interact/forms.html#submit-format

1

này nên đã làm việc - nhưng khi sử dụng POST, bạn sẽ phải đọc dữ liệu trình khác nhau trong Servlet của bạn (tôi giả sử, bạn' ? đang sử dụng Java trên phía máy chủ)

bạn có thể thử nó với một Servlet như thế này:

public class MyServlet extends HttpServlet { 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException { 

     System.out.println(req.getReader().readLine()); 
    } 
} 

Tất nhiên, bạn có thể sao chép nội dung của req.getReader() hoặc req.getInputStream() để b của riêng bạn uffer hoặc chuỗi vv

0

Đề xuất của tôi là: Thả phương pháp tham số.

Sử dụng @RequestBody thay thế. Nó sạch hơn nhiều. @RequestParam chỉ hữu ích nếu bạn muốn thực hiện yêu cầu GET đến máy chủ để nhanh chóng kiểm tra các dịch vụ còn lại. Nếu bạn đang xử lý dữ liệu ở bất kỳ mức độ phức tạp nào, bạn nên sử dụng các yêu cầu POST cho máy chủ không có giới hạn nội dung tối đa.

Dưới đây là ví dụ về cách bơm yêu cầu đến máy chủ. LƯU Ý: trong trường hợp này, nếu bạn đang sử dụng springboot làm phần phụ trợ, bạn sẽ phải thao tác kiểu nội dung fo là application/json.

private void invokeRestService() { 
     try { 
      // (a) prepare the JSON request to the server 
      RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, JSON_URL); 
      // Make content type compatible with expetations from SpringBoot 
      // rest web service 
      builder.setHeader("Content-Type", "application/json;charset=UTF-8"); 

      // (b) prepare the request object 
      UserLoginGwtRpcMessageOverlay jsonRequest = UserLoginGwtRpcMessageOverlay.create(); 
      jsonRequest.setUserName("John777"); 
      jsonRequest.setHashedPassword("lalal"); 
      String jsonRequestStr = JsonUtils.stringify(jsonRequest); 

      // (c) send an HTTP Json request 
      Request request = builder.sendRequest(jsonRequestStr, new RequestCallback() { 

       // (i) callback handler when there is an error 
       public void onError(Request request, Throwable exception) { 
        LOGGER.log(Level.SEVERE, "Couldn't retrieve JSON", exception); 
       } 

       // (ii) callback result on success 
       public void onResponseReceived(Request request, Response response) { 
        if (200 == response.getStatusCode()) { 
         UserLoginGwtRpcMessageOverlay responseOverlay = JsonUtils 
           .<UserLoginGwtRpcMessageOverlay>safeEval(response.getText()); 
         LOGGER.info("responseOverlay: " + responseOverlay.getUserName()); 
        } else { 
         LOGGER.log(Level.SEVERE, "Couldn't retrieve JSON (" + response.getStatusText() + ")"); 
        } 
       } 
      }); 
     } catch (RequestException e) { 
      LOGGER.log(Level.SEVERE, "Couldn't execute request ", e); 
     } 
    } 

Lưu ý UserLoginGwtRpcMessageOverlay là một bản vá hoạt động. Đây không phải là một đối tượng serializable GwtRpc, nó là một lớp mở rộng đối tượng javascript gwt.

Trân trọng.

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