2010-03-08 10 views
5

Estoy recibiendo tiempo de espera de usar JsonpRequestBuilder.GWT JsonpRequestBuilder Tiempo de espera problema

El código de punto de entrada dice así:

// 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 clase de artículo es simplemente:

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

public class Article extends JavaScriptObject { 


    protected Article() {}; 


} 

La página de GWT, sin embargo, siempre dan en la devolución de llamada onFailure() y mostrar esta alerta:

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

No se puede ver nada en la consola del complemento Eclipse. Probé la URL y funciona perfectamente.

agradecería cualquier consejo sobre la depuración de la técnica o sugerencia

Respuesta

4

tal vez debería ajustar la función de devolución de llamada explícita a través de setCallbackParam, ya que tienes callback=insertAgenda en su url - Presumo que informa al servidor de lo que debería ser el nombre de la devolución de llamada función que envuelve el JSON. Además, vale la pena verificar la consola de Firebug (o una herramienta similar para su navegador): incluso si GWT no informa ninguna excepción, Firebug aún podría hacerlo.

PD: Es útil utilizar una herramienta como Firebug para ver si la aplicación recibe la respuesta del servidor (eso significa que, por ejemplo, si necesita la llamada setCallbackParam) o tal vez hay algo mal en el lado del servidor (por la razón que sea).

0

Tienes que leer la devolución de llamada de petición-parámetro (por defecto callback, valor algo así como __gwt_jsonp__.P0.onSuccess) en serversite y tienen que modificar la salida a

<callback>(<json>); 

En este caso:

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

Tanto de estos tipos son absolutamente correctos, pero aquí hay un ejemplo concreto para ayudarlo a comprender exactamente a qué se refieren.

Esta es una api pública de JSON. Echar un vistazo a los resultados:

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


Esta API es compatible con JSONP pública a través del parámetro predefinido 'callback'. Básicamente, cualquier valor que pase a la devolución de llamada, se usará como el nombre de la función para envolver los datos JSON que desee. Echar un vistazo a los resultados de estas pocas preguntas:

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

Podría estar ocurriendo debido a otra razón, que la llamada de servicio web devuelve un objeto JSON y aunque la retrollamada espera objeto JSONP (tenga en cuenta que hay una diferencia).

lo tanto, si se trata de API de Google Maps, y que está viendo esta excepción, es necesario cambiarlo a api proporcionar por API de Google Maps, algo así como

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

O de lo contrario podría utilizar RequestBuilder como en biblioteca gwt.