3

我正在尝试通过 jQuery 访问 Facebook API Admin.getMetrics 方法。我在服务器端正确地编写了请求 url(为了让我的应用程序保密)。然后我将 url 发送到浏览器以使用jQuery.getJSON().

Facebook 要求我将我的所有请求参数的副本连同我的应用程序密码一起发送,以验证我的真实性。问题是 jQuery 想要生成回调函数本身的名称,以便与它为您传入的匿名函数提供的名称相匹配,以便在数据返回时调用。因此,函数的名称在执行之前不可用,jQuery.getJSON()并且由于签名不匹配,Facebook 认为我的请求是不真实的(我发送的签名不包含正确的回调参数,因为直到jQuery.getJSON()运行才生成)。

我能想到的解决这个问题的唯一方法是以某种方式指定我的函数的名称,jQuery.getJSON()而不是让它保持匿名。但我在 jQuery AP 中找不到这样做的任何选项。

4

4 回答 4

3

唯一对我有用的是以下设置

jQuery.ajax({ url: fbookUrl, dataType: "jsonp", type: "GET", cache: true, jsonp: false, jsonpCallback: "MyFunctionName" //insert here your function name });

于 2011-05-18T12:30:13.487 回答
2

的使用jQuery.getScript结果接近——但不完全——答案。使用 getScript 消除了 jQuery 将动态命名的匿名函数添加到请求参数的需要(尽管如果您继续并像上面的代码一样向它传递匿名函数,它仍然会这样做)。jQuery.getScript但是,与jQuery 的 Ajax 库中的所有其他调用一样, in的默认设置是附加一个额外的参数_=12344567(其中 1234567 实际上是一个时间戳)。jQuery 这样做是为了防止浏览器缓存响应。但是,这个附加功能会破坏我对请求的签名,就像自动命名的回调函数一样。

在 #jquery 的一些帮助下,我了解到让 jQuery 完全不弄乱你的参数的唯一方法是使用jQuery.Ajax带有以下参数的基本方法发出请求:

jQuery.ajax({
  url: fbookUrl,
  dataType: "script",
  type: "GET",
  cache: true,
  callback: null,
  data: null
});

fbookUrl我尝试使用包括签名和 在内的完整参数请求的 Facebook API url在哪里callback=myFunction)。arg 指定生成的dataType: "script"JSONP 应填充到页面上的脚本标记中执行,cache: true告诉 jQuery 允许浏览器缓存响应,即跳过添加时间戳参数。

于 2008-10-15T16:12:22.370 回答
1

您可以将 JSONP 选项传递给 $.ajaxSetup,这将允许您修复被调用的函数名称,文档如下:

jsonp String
覆盖 jsonp 请求中的回调函数名称。在“callback=?”中将使用该值代替“callback” GET 的 url 中的查询字符串的一部分或 POST 的数据。所以 {jsonp:'onJsonPLoad'} 会导致 'onJsonPLoad=?' 传递给服务器。

有关更多详细信息,请参见此处http://docs.jquery.com/Ajax/jQuery.ajax#options

于 2008-10-14T23:47:08.087 回答
0

这是具有固定回调的更好解决方案:

window.fixed_callback = function(data){
    alert(data.title);
};

$(function() {
    $.getScript("http://api.flickr.com/services/feeds/photos_public.gne?tags=cats&tagmode=any&format=json&jsoncallback=fixed_callback", function(data) {
    alert('done'); } );
});

此回调的问题是您一次只能处理一种请求,因为该函数是全局注册的。回调函数可能不得不变成它可以检索和调用适当函数的不同类型数据的调度程序。

于 2008-10-15T15:26:28.440 回答