【问题标题】:How to call RESTFUL services from GWT?如何从 GWT 调用 RESTFUL 服务?
【发布时间】:2010-10-27 07:48:08
【问题描述】:

我使用 GWT 作为 Web 开发框架。我需要从我的 GWT 客户端代码访问一些 REST 服务。我还需要解析作为这些服务的响应格式的 JSON(或者可能是 XML)。解决这个问题的最佳方法是什么?

提前致谢。

【问题讨论】:

    标签: java rest gwt


    【解决方案1】:

    您可以使用标准 GWT RequestBuilder(或 JsonpRequestBuilder,如果您需要调用另一个域上的服务)来调用 REST 服务。

    使用 JSON 响应字符串,您可以调用JSONParser.parseStrict(jsonString) 来获取JSONValue,它可以是JSONObjectJSONArray 等。这些都可以在this package 中找到。

    【讨论】:

      【解决方案2】:

      您可以通过创建代理服务接口在您的 GWT 应用程序中使用 RestyGWT 轻松调用 Restful Web 服务:

      import javax.ws.rs.POST;
      ...
      public interface PizzaService extends RestService {
          @POST
          public void order(PizzaOrder request, 
                            MethodCallback<OrderConfirmation> callback);
      }
      

      或者当您不想麻烦创建服务接口时:

      Resource resource = new Resource( GWT.getModuleBaseURL() + "pizza-service");
      
      JSONValue request = ...
      
      resource.post().json(request).send(new JsonCallback() {
          public void onSuccess(Method method, JSONValue response) {
              System.out.println(response);
          }
          public void onFailure(Method method, Throwable exception) {
              Window.alert("Error: "+exception);
          }
      });
      

      它还有很好的 API 用于将 Java 对象编码和解码为 JSON。

      【讨论】:

        【解决方案3】:

        对于 REST 服务:结帐gwt-rest

        有关 GWT 中的 JSON 支持:请参阅 here

        【讨论】:

        • restful-gwt 如何调用 restful 服务。我在项目文档中看不到示例。
        【解决方案4】:

        RequestBuilder 是一种发出 HTTP 请求的低级方法。

        您可以采用更高级别的方法来使用Turbo GWT HTTP,这是一种用于管理客户端-服务器通信和流畅执行请求的便捷 API。

        它更适合 REST 风格的通信。考虑以下示例:

        Request request = requestor.request(Void.class, Book.class)
                .path("server").segment("books").segment(1)
                .get(new AsyncCallback<Book>() {
                    @Override
                    public void onFailure(Throwable caught) {
        
                    }
        
                    @Override
                    public void onSuccess(Book result) {
                        Window.alert("My book title: " + result.getTitle());
                    }
        });
        

        在调用 REST 服务之前无需映射它们(这在概念上是 RPC 通信所必需的,但不是 REST 所必需的)。您可以按需使用您的服务。

        【讨论】:

          【解决方案5】:

          以下代码源使用 RequestBuilder 使用 GWT 向 RESTFUL Webservice 发布请求

          JSONObject jsonObject = new JSONObject();
          
          email = (String) vslLoginView.getFieldUserEmailID().getValue();
          password = (String) vslLoginView.getFieldUserPasword().getValue();
          
          jsonObject.put("email", new JSONString(email));
          jsonObject.put("password", new JSONString(password));
          System.out.println("Password at Presenter:"
              + jsonObject.get("password"));
          RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,
              RecursosURL.LOGIN.toString()/*your restful webservice url */ + "/authenticateuser");
          builder.setHeader("Content-Type", "application/json");
          try {
              SC.showPrompt(constants.wait());
              builder.sendRequest(jsonObject.toString(),
                  new SamrtWebRequestCallback(false, false, false, false) {
          
                      @Override
                      public void onSuccess(Response response) {
                          // Recevie response of logged user data from  restful webservice
                          JSONObject jsonOnlineUser = JSONParser.parse(
                              response.getText()).isObject();
                          UserTO userTO = ConverterUser
                              .converterJSONParaUser(jsonOnlineUser);
                          String primaryAccess = jsonOnlineUser.get(
                              "primaryAccess").isString().stringValue();
          
                          HashMap<String, Object> parameters = new HashMap<String, Object>();
                          if (primaryAccess.equals("S")) {
          
                              parameters.put("email", email);
                              parameters.put("password", password);
                              parameters.put("id", jsonOnlineUser.get("id")
                                  .isString().stringValue());
          
                          } else {
          
                              parameters.put("email", email);
                              handlerManager.fireEvent(new EvtIrParaPage(
                                  Pages.PAGE_INICIAL, parameters));
                          }
          
                      }
          
                      @Override
                      protected void onErrorCallbackAdapter(Response response) {
                          vslLoginView.getLabelMsgErro().setContents(
                              response.getText());
                          vslLoginView.getLabelMsgErro().setVisible(true);
                      }
                  });
          
          } catch (RequestException e) {
              e.printStackTrace();
          }
          

          【讨论】:

            【解决方案6】:

            对于这些东西,我发现使用 GWT JSNI 更容易。

            例如,调用 JSON 服务来获取用户的国家代码:

            public static native void getCountryCode(Loaded<String> countryCode) /*-{
                var xhttp = new XMLHttpRequest();
                xhttp.onreadystatechange = function() {
                    if (this.readyState == 4 && this.status == 200) {
                        var jsonObj = JSON.parse(xhttp.responseText);
                        countryCode.@mypackage.Loaded::data(*)(jsonObj.country_code);
                    }
                };
                xhttp.open("GET", "https://api.ipdata.co/", true);
                xhttp.send();
            }-*/;
            

            “加载”只是:

            package mypackage;
            
            public interface Loaded<T> {
                public void data(T data);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-08-28
              • 2011-08-28
              • 2011-11-02
              • 2015-12-15
              • 1970-01-01
              • 2011-06-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多