【问题标题】:Making POST requests with parameters in GWT在 GWT 中使用参数发出 POST 请求
【发布时间】:2011-04-28 11:18:04
【问题描述】:

我正在尝试使用一组参数对给定 URL 执行 POST 请求。我遇到的问题是发出了 POST 请求,但没有传递任何参数。

    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) {}
}

如果我使用 GET 模式并手动将查询字符串添加到请求中,这会很好 - 但我需要使用 POST,因为要传递的数据可能很大......

【问题讨论】:

    标签: gwt smartgwt


    【解决方案1】:

    设置请求的标头:

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

    【讨论】:

    • 谢谢!没有我的接受器 servlet 就无法工作......永远不会想到这一点!谢谢!
    【解决方案2】:

    不能使用 Web 表单向混合使用 GET 和 POST 的页面发送请求。如果将表单的方法设置为 GET,则所有参数都在查询字符串中。如果将表单的方法设置为 POST,则所有参数都在请求正文中。

    来源:HTML 4.01 标准,第 17.13 节表单提交网址:http://www.w3.org/TR/html4/interact/forms.html#submit-format

    【讨论】:

      【解决方案3】:

      这应该已经可以了 - 但是当使用 POST 时,您必须在 Servlet 中以不同的方式读取提交的数据(我假设您在服务器端使用 Java?)

      你可以用这样的 Servlet 试试:

      public class MyServlet extends HttpServlet {
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                         throws ServletException, IOException {
      
              System.out.println(req.getReader().readLine());
          }
      }
      

      当然,您可以将req.getReader()req.getInputStream() 的内容复制到自己的缓冲区或字符串等中。

      【讨论】:

        【解决方案4】:

        我的建议是: 丢弃参数方法。

        改用@RequestBody。它更干净。 @RequestParam 仅在您想向服务器发出 GET 请求以快速测试休息服务时才有用。 如果您正在处理任何复杂程度的数据,您最好使用没有最大内容限制的服务器的 POST 请求。

        这是一个如何向服务器发送请求的示例。 注意:在这种情况下,如果您使用 springboot 作为后端,则必须操作内容类型为 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);
                }
            }
        

        注意 UserLoginGwtRpcMessageOverlay 是一个补丁工作。这不是一个 GwtRpc 可序列化对象,它是一个扩展 gwt javascript 对象的类。

        问候。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-24
          • 1970-01-01
          • 2017-09-13
          • 2015-03-05
          • 2018-10-08
          • 2017-11-28
          • 2018-04-23
          • 1970-01-01
          相关资源
          最近更新 更多