2010-03-08 6 views
5

Ich bekomme eine Auszeit von der Verwendung von JsonpRequestBuilder.GWT JsonpRequestBuilder Timeout Problem

Der Einstiegspunkt Code lautet wie folgt:

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

Der Artikel Klasse ist einfach:

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

public class Article extends JavaScriptObject { 


    protected Article() {}; 


} 

Die GWT Seite jedoch immer die onFailure() Rückruf betroffen und zeigen diese Warnung:

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

Fehler bei der Anzeige der Eclipse-Plug-in-Konsole. Ich habe die URL ausprobiert und es funktioniert perfekt.

jede Spitze schätzen würde auf Debug-Technik oder einen Vorschlag

Antwort

4

Vielleicht sollten Sie die Callback-Funktion explizit über setCallbackParam gesetzt, da Sie callback=insertAgenda in Ihrer URL haben - ich nehme an, dass der Server informiert, was der Name der Callback sein sollte Funktion, die den JSON umschließt. Es lohnt sich auch, die Firebug-Konsole (oder ein ähnliches Tool für Ihren Browser) zu überprüfen - selbst wenn GWT keine Ausnahmen meldet, könnte Firebug es dennoch tun.

PS: Es ist nützlich, ein Tool wie Firebug zu verwenden, um zu sehen, ob die Anwendung wirklich die Antwort vom Server erhält (das würde bedeuten, dass Sie zum Beispiel den setCallbackParam Aufruf brauchen) oder vielleicht stimmt etwas nicht die Serverseite (aus welchem ​​Grund auch immer).

0

Sie haben die Rückrufanfrage-Parameter (default callback, Wert etwas wie __gwt_jsonp__.P0.onSuccess) auf serversite zu lesen und die Ausgabe auf

<callback>(<json>); 

In diesem Fall ändern müssen:

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

Both von diesen Jungs sind absolut richtig, aber hier ist ein konkretes Beispiel, um Ihnen zu helfen, genau zu verstehen, worauf sie sich beziehen.

Dies ist eine öffentliche JSON API. Werfen Sie einen Blick auf die Ergebnisse:

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


Diese öffentliche API JSONP durch die vordefinierten Parameter 'Callback' unterstützt. Grundsätzlich wird der Wert, den Sie an den Rückruf übergeben, als Funktionsname verwendet, um die gewünschten JSON-Daten zu umschließen. Werfen Sie einen Blick auf die Ergebnisse dieser wenigen Anfragen:

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

es wegen einem anderen Grund geschehen konnte, dass der Webservice Aufruf ein JSON-Objekt zurückgibt und aber der Rückruf erwartet JSONP Objekt (Beachten Sie, dass es einen Unterschied gibt).

Also, wenn Sie mit Google Maps API zu tun haben, und Sie diese Ausnahme sehen, müssen Sie es api ändern, indem Sie Karten api bieten, so etwas wie

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

sonst könnten Sie RequestBuilder verwenden, wie in gwt Bibliothek.