【发布时间】:2010-10-27 07:48:08
【问题描述】:
我使用 GWT 作为 Web 开发框架。我需要从我的 GWT 客户端代码访问一些 REST 服务。我还需要解析作为这些服务的响应格式的 JSON(或者可能是 XML)。解决这个问题的最佳方法是什么?
提前致谢。
【问题讨论】:
我使用 GWT 作为 Web 开发框架。我需要从我的 GWT 客户端代码访问一些 REST 服务。我还需要解析作为这些服务的响应格式的 JSON(或者可能是 XML)。解决这个问题的最佳方法是什么?
提前致谢。
【问题讨论】:
您可以使用标准 GWT RequestBuilder(或 JsonpRequestBuilder,如果您需要调用另一个域上的服务)来调用 REST 服务。
使用 JSON 响应字符串,您可以调用JSONParser.parseStrict(jsonString) 来获取JSONValue,它可以是JSONObject、JSONArray 等。这些都可以在this package 中找到。
【讨论】:
您可以通过创建代理服务接口在您的 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。
【讨论】:
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 使用 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();
}
【讨论】:
对于这些东西,我发现使用 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);
}
【讨论】: