2010-10-27 4 views
19

J'utilise GWT comme framework de développement web. J'ai besoin d'accéder à certains services REST à partir de mon code 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 pour ce problème?Comment appeler les services RESTFUL de GWT?

Merci d'avance.

Répondre

14

Vous pouvez appeler les services REST en utilisant la norme GWT RequestBuilder (ou JsonpRequestBuilder si vous avez besoin d'appeler les services sur un autre domaine).

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

2

Pour les services REST: consultez gwt-rest.

Pour le support JSON GWT: voir here

+0

Comment-GWT reposant appelle un service reposant. Je ne pouvais pas voir un exemple dans la documentation du projet. – ovunccetin

+0

désolé, mauvais lien ajouté. Je voulais dire gwt-repos. – z00bs

7

Vous pouvez facilement appeler un service web Restful utilisant 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 passer par la peine 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 a également une API sympa pour encoder et décoder l'objet Java en JSON.

2

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 la gestion de la communication client-serveur et l'exécution des requêtes.

Il 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'y a pas besoin de mapper vos services REST avant de les appeler (ce qui est nécessaire sur le plan conceptuel pour la communication RPC, mais pas pour REST). Vous pouvez simplement consommer vos services à la demande.

+0

Ils ont renoncé à "demandeur" https://github.com/reinert/requestor –

2

Le dessous source de code utilisé RequestBuilder pour poster une demande à l'aide Webservice RESTFUL 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(); 
} 
Questions connexes