Как позвонить RESTFUL услугам из GWT?
Я использую GWT как основу для веб-разработки. Мне нужно получить доступ к некоторым службам REST из моего кода клиента GWT. Также мне нужно проанализировать JSON (или, возможно, XML), который является ответом на эти службы. Каков наилучший способ для этой проблемы?
Спасибо заранее.
Ответы
Ответ 1
Вы можете вызвать службы REST с помощью стандартного GWT RequestBuilder
(или JsonpRequestBuilder
, если вам нужно вызвать службы в другом домене).
С помощью строки ответа JSON вы можете вызвать JSONParser.parseStrict(jsonString)
, чтобы получить JSONValue
, который может быть JSONObject
, JSONArray
и т.д. Это все доступно в этот пакет.
Ответ 2
С помощью RestyGWT в приложении GWT вы можете легко вызвать веб-службы Restful, создав прокси-сервисный интерфейс:
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 Object для JSON.
Ответ 3
Для служб REST: checkout gwt-rest.
Поддержка JSON в GWT: см. здесь
Ответ 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 для отправки запроса в RESTFUL Webservice с использованием 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();
}