Как позвонить в RESTFUL сервисы от GWT? - PullRequest
23 голосов
/ 27 октября 2010

Я использую GWT в качестве основы веб-разработки.Мне нужно получить доступ к некоторым службам REST из моего клиентского кода GWT.Также мне нужно проанализировать JSON (или, может быть, XML), который является форматом ответа этих сервисов.Как лучше всего решить эту проблему?

Заранее спасибо.

Ответы [ 6 ]

17 голосов
/ 27 октября 2010

Вы можете позвонить в службы REST, используя стандарт GWT RequestBuilder (или JsonpRequestBuilder, если вам необходимо вызвать службы в другом домене).

ССтрока ответа JSON, вы можете вызвать JSONParser.parseStrict(jsonString), чтобы получить JSONValue, который может быть JSONObject, JSONArray и т. д. Это все доступно в в этом пакете .

8 голосов
/ 15 декабря 2012

Вы можете легко вызывать веб-службы Restful, используя RestyGWT в своем приложении GWT, создав интерфейс прокси-службы:

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.

2 голосов
/ 13 апреля 2016

В приведенном ниже источнике кода используется 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();
}
2 голосов
/ 04 мая 2014

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). Вы можете просто потреблять свои услуги по требованию.

2 голосов
/ 27 октября 2010

Для служб REST: оформить заказ gwt-rest .

Информацию о поддержке JSON в GWT: см. здесь

0 голосов
/ 19 мая 2018

Для этого мне проще воспользоваться 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();
}-*/;

Где "Loaded""просто:

package mypackage;

public interface Loaded<T> {
    public void data(T data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...