GWT JsonpRequestBuilder超时问题

时间:2010-03-08 20:09:09

标签: json 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/developer-calendar@google.com/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插件控制台上看不到任何内容。我尝试了网址,效果很好。

非常感谢有关调试技​​巧或建议的任何提示

4 个答案:

答案 0 :(得分:4)

也许您应该通过setCallbackParam显式设置回调函数,因为您的网址中有callback=insertAgenda - 我假设通知服务器应该包含JSON的回调函数的名称。 此外,值得检查Firebug的控制台(或浏览器的类似工具) - 即使GWT没有报告任何异常,Firebug仍然可能。

PS:使用像Firebug这样的工具来查看应用程序是否确实从服务器接收响应(这意味着,例如,您确实需要setCallbackParam调用)或者可能是服务器端出错(无论出于何种原因)。

答案 1 :(得分:0)

您必须在服务器上读取回调请求 - 参数(默认callback,值类似__gwt_jsonp__.P0.onSuccess),并且必须将输出修改为

<callback>(<json>);

在这种情况下:

__gwt_jsonp__.P0.onSuccess(<json>);

答案 2 :(得分:0)

这两个人都是绝对正确的,但这里有一个具体的例子可以帮助你准确理解他们所指的是什么。

这是一个公开的JSON API。看看结果:

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


此公共API通过预定义参数'callback'支持JSONP。基本上,无论您传递给回调的值是什么,都将用作函数名称来包装您想要的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

答案 3 :(得分:0)

由于另一个原因,Web服务调用返回一个JSON对象,但回调期望JSONP对象(注意存在差异),可能会发生这种情况。

因此,如果您正在处理谷歌地图api,并且您看到此异常,则需要将其更改为api由maps api提供,例如

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

否则你可以在gwt库中使用RequestBuilder。