我正在使用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插件控制台上看不到任何内容。我尝试了网址,效果很好。
非常感谢有关调试技巧或建议的任何提示
答案 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。