如何从GWT调用RESTFUL服务?

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

提前致谢。

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

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

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

 import javax.ws.rs.POST; ... public interface PizzaService extends RestService { @POST public void order(PizzaOrder request, MethodCallback 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 Object到JSON。

对于REST服务:checkout gwt-rest 。

对于GWT中的JSON支持:请参见此处

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

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

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

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

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

下面的代码源使用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 parameters = new HashMap(); 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(); } 

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

例如,调用JSON服务以获取用户国家/地区代码:

 public static native void getCountryCode(Loaded 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 { public void data(T data); }