web-dev-qa-db-fra.com

Comment appeler les services RESTFUL de GWT?

J'utilise GWT comme cadre de développement Web. J'ai besoin d'accéder à certains services REST à partir du code de mon client GWT. Aussi, j'ai besoin d'analyser JSON (ou peut-être XML) qui est le format de réponse de ces services. Quel est le meilleur moyen de résoudre ce problème?

Merci d'avance.

21
ovunccetin

Vous pouvez appeler les services REST à l'aide de GWT standard RequestBuilder (ou JsonpRequestBuilder si vous devez appeler des services sur un autre domaine).

Avec la chaîne de réponse JSON, vous pouvez appeler JSONParser.parseStrict(jsonString) pour obtenir un JSONValue, qui peut être un JSONObject, JSONArray, etc. Tout est disponible dans ce paquetage .

16
Jason Hall

Vous pouvez facilement appeler un service Web Restful à l’aide de RestyGWT dans votre application GWT en créant une interface de service proxy:

import javax.ws.rs.POST;
...
public interface PizzaService extends RestService {
    @POST
    public void order(PizzaOrder request, 
                      MethodCallback<OrderConfirmation> callback);
}

ou lorsque vous ne voulez pas avoir à vous soucier de créer des interfaces de service:

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);
    }
});

Il dispose également de l’API Nice pour l’encodage et le décodage d’objets Java en JSON.

8
Saeed Zarinfam

RequestBuilder est une approche de bas niveau pour effectuer des requêtes HTTP.

Vous pouvez recourir à une approche de niveau supérieur en utilisant Turbo GWT HTTP , une API pratique pour gérer les communications client-serveur et exécuter les requêtes avec aisance.

Cela correspond mieux à la communication de style REST. Prenons l'exemple suivant:

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());
            }
});

Il n'est pas nécessaire de mapper vos services REST avant de les appeler (ce qui est conceptuellement nécessaire pour la communication RPC, mais pas pour REST). Vous pouvez simplement consommer vos services à la demande.

2
reinert

Pour les services REST: Caisse gwt-rest .

Pour le support JSON dans GWT: voir ici

2
z00bs

La source de code ci-dessous utilisée par RequestBuilder pour envoyer une demande à RESTFUL Webservice à l'aide de 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
user4423251

Pour ce genre de choses, je trouve plus facile de recourir à GWT JSNI.

Par exemple, appeler un service JSON pour obtenir le code de pays de l'utilisateur:

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);
            [email protected]::data(*)(jsonObj.country_code);
        }
    };
    xhttp.open("GET", "https://api.ipdata.co/", true);
    xhttp.send();
}-*/;

Où "Loaded" est juste:

package mypackage;

public interface Loaded<T> {
    public void data(T data);
}
0
Craigo