【发布时间】:2013-06-18 00:49:45
【问题描述】:
我正在使用 jQuery 1.9.1 对 Etsy API 执行 jsonp。下面是一个用于调用 API 的例程;它接受一个签名的请求(url)、一个 jsonp 回调名称和一个错误处理程序。
call: function (signedOAuthRequest, callback, errorFn) {
$.ajax({
url: signedOAuthRequest,
type: "GET",
dataType: "jsonp",
jsonpCallback: callback,
jsonp: false,
crossDomain: true,
cache: true,
processData: false,
error: function (jqXHR, textStatus, errorThrown) {
if (errorFn != undefined) {
errorFn(jqXHR, textStatus, errorThrown);
}
}
});
用法:
call("http://the.api/?signedrequest", "myCallback", myErrorHandler);
而且它有效。 myCallback 触发,收到的 json 对象看起来不错。一切都很好。
除了...
myCallback 完成后,错误处理程序立即运行。在错误处理程序中,状态码为 200,错误消息为"parsererror"。 errorThrown.message 是"myCallback was not called"。问题是,myCallback肯定被调用了,传递给它的 json 对象被解析得很好,所以我根本不明白。
为什么在成功调用时会引发此错误?
【问题讨论】:
-
将回调移动到
success: callback,删除jsonp: false,删除jsonpCallback,删除cache: true,也不需要type: "get"。processData也不需要。 -
如果您想在窗口上定义自己的回调,请不要使用 jsonp 数据类型,只需使用 getScript。
-
并传递
myCallback而不是"myCalback"作为callback参数 -
你负责
the.api吗?它与您的示例中运行的 JS ocde 的起源域相同吗? -
@KevinB 该 URL 是一个预烘焙的 SHA-1 签名的 OAuth 1.0 请求(由服务器生成并传递给 JS 客户端)。它已经将回调的名称烘焙到签名中,因此如果我让 jQuery 管理回调的名称(或允许它向 URL 添加缓存时间戳),这会在提供程序上创建 OAuth 签名不匹配。跨度>
标签: json jquery cross-domain jsonp