2010-03-08 4 views
5

Je reçois un délai d'utilisation de JsonpRequestBuilder.GWT JsonpRequestBuilder Problème de délai d'attente

Le code de point d'entrée va comme ceci:

// private static final String SERVER_URL = "http://localhost:8094/data/view/"; 
private static final String SERVER_URL = "http://www.google.com/calendar/feeds/[email protected]/public/full?alt=json-in-script&callback=insertAgenda&orderby=starttime&max-results=15&singleevents=true&sortorder=ascending&futureevents=true"; 
private static final String SERVER_ERROR = "An error occurred while " 
     + "attempting to contact the server. Please check your network " 
     + "connection and try again."; 

/** 
* This is the entry point method. 
*/ 
public void onModuleLoad() { 

    JsonpRequestBuilder requestBuilder = new JsonpRequestBuilder(); 
    // requestBuilder.setTimeout(10000); 
    requestBuilder.requestObject(SERVER_URL, new Jazz10RequestCallback()); 

} 

class Jazz10RequestCallback implements AsyncCallback<Article> { 


    @Override 
    public void onFailure(Throwable caught) { 
     Window.alert("Failed to send the message: " + caught.getMessage());  
    } 

    @Override 
    public void onSuccess(Article result) { 
     // TODO Auto-generated method stub 
     Window.alert(result.toString()); 
    } 

La classe article est tout simplement:

import com.google.gwt.core.client.JavaScriptObject; 

public class Article extends JavaScriptObject { 


    protected Article() {}; 


} 

La page GWT, cependant, toujours frappé le rappel onFailure() et afficher cette alerte:

Failed to send the message. Timeout while calling <url>. 

Impossible de voir quoi que ce soit sur la console du plug-in Eclipse. J'ai essayé l'URL et cela fonctionne parfaitement.

apprécierait toute astuce sur la technique mise au point ou suggestion

Répondre

4

Peut-être que vous devez définir la fonction de rappel explicitement via setCallbackParam, puisque vous avez callback=insertAgenda dans votre URL - Je suppose que informe le serveur ce qui devrait être le nom de la fonction de rappel fonction qui enveloppe le JSON. En outre, il vaut la peine de vérifier la console de Firebug (ou un outil similaire pour votre navigateur) - même si GWT ne signale aucune exception, Firebug peut toujours le faire. PS: Il est utile d'utiliser un outil comme Firebug pour voir si l'application reçoit réellement la réponse du serveur (cela signifierait, par exemple, que vous avez besoin de l'appel setCallbackParam) ou peut-être que quelque chose ne va pas le côté serveur (pour une raison quelconque).

0

Vous devez lire le rappel demande-Paramètre (quelque chose par défaut callback, valeur comme __gwt_jsonp__.P0.onSuccess) sur serversite et doivent modifier la sortie

<callback>(<json>); 

Dans ce cas:

__gwt_jsonp__.P0.onSuccess(<json>); 
0

deux de ces gars-là sont absolument corrects, mais voici un exemple concret pour vous aider à comprendre exactement ce dont ils parlent aussi.

Ceci est une API publique JSON. Jetez un oeil sur les résultats:

http://ws.geonames.org/postalCodeLookupJSON?postalcode=M1&country=GB&maxRows=4


Cette API publique prend en charge JSONP via le paramètre prédéfini « de rappel ». Fondamentalement, quelle que soit la valeur que vous passez dans le rappel, sera utilisé comme nom de la fonction pour envelopper les données JSON que vous désirez. Jetez un oeil sur les résultats de ces quelques demandes:

http://ws.geonames.org/postalCodeLookupJSON?postalcode=M1&country=GB&maxRows=4&callback=totallyMadeUp

http://ws.geonames.org/postalCodeLookupJSON?postalcode=M1&country=GB&maxRows=4&callback=trollingWithJSONP

0

Il pourrait se produire à cause d'une autre raison, que l'appel webservice retourne un objet JSON et mais le rappel attend objet JSONP (notez qu'il y a une différence).

Donc, si vous traitez avec google maps api, et vous voyez cette exception, vous devez changer pour api fournir par api cartes, quelque chose comme

final GeocoderRequest request = GeocoderRequest.create(); 
    request.setAddress(query); 
    try { 
     GWT.log("sending GeoCoderRequest"); 
     if (m_geocoder == null) { 
      m_geocoder = Geocoder.create(); 
     } 

     m_geocoder.geocode(request, new Geocoder.Callback() { 
      @Override 
      public void handle(final JsArray<GeocoderResult> results, 
        final GeocoderStatus status) { 
       handleSuccess(results, status); 
      } 
     }); 
    } catch (final Exception ex) { 
     GWT.log("GeoCoder", ex); 
    } 

Ou bien vous pouvez utiliser RequestBuilder comme dans bibliothèque gwt.

Questions connexes