如何从GWT调用RESTFUL服务?
我正在使用GWT作为Web开发框架。 我需要从我的GWT客户端代码访问一些REST服务。 此外,我需要解析JSON(或XML),这是这些服务的响应格式。 哪个是解决这个问题的最佳方法?
提前致谢。
您可以使用标准GWT RequestBuilder
(或JsonpRequestBuilder
如果您需要在另一个域上调用服务)来调用REST服务。
使用JSON响应字符串,您可以调用JSONParser.parseStrict(jsonString)
来获取JSONValue
,它可以是JSONObject
, JSONArray
等。这在此包中都可用。
您可以通过创建代理服务接口,在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); }