2010-10-27 49 views
19

我使用GWT作为Web开发框架。我需要从我的GWT客户端代码访问一些REST服务。此外,我需要解析这些服务的响应格式JSON(或可能是XML)。哪个是解决这个问题的最好方法?如何从GWT调用RESTFUL服务?

在此先感谢。

回答

14

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

随着JSON响应字符串,你可以调用JSONParser.parseStrict(jsonString)获得JSONValue,它可以是一个JSONObjectJSONArray等,这是在this package一应俱全。

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

,或者当你不想去通过创建服务接口的麻烦:

2

对于REST服务:结帐gwt-rest

支持JSON在GWT:看here

+0

宁静-GWT如何调用RESTful服务到RESTful Web服务的请求。我在项目文档中看不到例子。 – ovunccetin 2010-10-27 10:24:58

+0

抱歉,添加了错误的链接。我的意思是gwt-rest。 – z00bs 2010-10-27 11:09:49

7

您可以轻松地通过创建代理服务接口调用使用RestyGWT一个RESTful Web服务在您的GWT应用程序

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。

2

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)。您可以按需使用您的服务。的代码中使用RequestBuilder

+0

他们重新命名为“Requestor”https://github.com/reinert/requestor – 2015-09-17 13:54:46

2

的下方源后使用GWT

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