2010-03-08 6 views
5

Я получаю время от использования JsonpRequestBuilder.GWT JsonpRequestBuilder Ошибка таймаута

код точки входа выглядит следующим образом:

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

Класс статьи просто:

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

public class Article extends JavaScriptObject { 


    protected Article() {}; 


} 

GWT страницы, однако, всегда ударил() обратного вызова OnFailure и показать это предупреждение:

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

Невозможно увидеть что-либо на консоли плагина Eclipse. Я пробовал URL, и он работает отлично.

Оценил любой совет по отладке техники или предложение

ответ

4

Может быть, вы должны установить функцию обратного вызова в явном виде с помощью setCallbackParam, поскольку у вас есть callback=insertAgenda в свой адрес - я полагаю, что информирует сервер, что должно быть имя функции обратного вызова функция, которая обертывает JSON. Кроме того, стоит проверить консоль Firebug (или аналогичный инструмент для вашего браузера) - даже если GWT не сообщает никаких исключений, Firebug все еще может.

PS: Полезно использовать такой инструмент, как Firebug, чтобы узнать, действительно ли приложение получает ответ от сервера (это означает, что, например, вам нужен звонок setCallbackParam), или, может быть, что-то не так на стороне сервера (по какой-либо причине).

0

Вы должны прочитать обратный запрос-параметр (по умолчанию callback, значение что-то вроде __gwt_jsonp__.P0.onSuccess) на serversite и должен изменить вывод

<callback>(<json>); 

В этом случае:

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

Оба из этих парней абсолютно верны, но вот конкретный пример, который поможет вам точно понять, что они означают.

Это публичный JSON api. Посмотрите на результаты:

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


Этот открытый API поддерживает JSONP через предопределенный параметр «обратного вызова». В принципе, любое значение, которое вы передадите в callback, будет использоваться в качестве имени функции для обертывания данных JSON, которые вы желаете. Посмотрите на результатах этих нескольких запросов:

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

Это может происходить из-за другую причину, что вызов вебсервиса возвращает объект JSON и но обратный вызов ожидает объект JSONP (обратите внимание, что есть разница).

Так что, если вы имеете дело с Google Maps API, и вы видите это исключение, вы должны изменить его на API предоставляют по API Карт Google, что-то вроде

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

Или вы могли бы использовать RequestBuilder как в gwt библиотека.

 Смежные вопросы

  • Нет связанных вопросов^_^