2010-10-27 19 views
19

Sto usando GWT come framework di sviluppo web. Devo accedere ad alcuni servizi REST dal mio codice cliente GWT. Inoltre ho bisogno di analizzare JSON (o forse XML) che è il formato di risposta di questi servizi. Qual è il modo migliore per questo problema?Come chiamare i servizi RESTFUL da GWT?

Grazie in anticipo.

risposta

14

È possibile chiamare i servizi REST utilizzando lo standard GWT RequestBuilder (o JsonpRequestBuilder se avete bisogno di chiamare i servizi di un altro dominio).

Con la stringa di risposta JSON, è possibile chiamare JSONParser.parseStrict(jsonString) per ottenere un JSONValue, che può essere un JSONObject, JSONArray, ecc Questo è tutto disponibile in this package.

2

Per i servizi REST: checkout gwt-rest.

Per il supporto JSON in GWT: vedi here

+0

Come ristoratore-GWT chiama un servizio riposante. Non ho potuto vedere un esempio nella documentazione del progetto. – ovunccetin

+0

scusa, collegamento errato aggiunto. Intendevo gwt-resto. – z00bs

7

Si può facilmente chiamare un servizio RESTful Web utilizzando RestyGWT nell'applicazione GWT con la creazione di interfaccia di servizio di proxy:

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

o quando non si vuole passare attraverso la briga di creare interfacce di servizio:

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

Ha anche una buona API per la codifica e la decodifica di Java Object in JSON.

2

RequestBuilder è un approccio di basso livello per effettuare richieste HTTP.

È possibile ricorrere ad un approccio di livello superiore che funziona con Turbo GWT HTTP, una comoda API per la gestione della comunicazione client-server ed esecuzione fluente delle richieste.

Si adatta meglio alla comunicazione in stile REST. Si consideri il seguente esempio:

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

Non c'è alcuna necessità di mappare i servizi REST prima di chiamarli (che è concettualmente necessario per la comunicazione RPC, ma non per REST). Puoi semplicemente consumare i tuoi servizi su richiesta.

+0

Sono rinominati "Richiedente" https://github.com/reinert/requestor –

2

La fonte di sotto del codice utilizzato RequestBuilder per pubblicare una richiesta di servizio Web RESTFUL utilizzando 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(); 
} 
Problemi correlati