使用命名函数作为jQuery中$ .getJSON的回调来满足Facebook请求签名要求

时间:2008-10-14 23:21:24

标签: javascript jquery json facebook jsonp

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

Facebook要求我发送我的所有请求参数的副本以及我的应用程序密码和请求,以验证我的真实性。问题是jQuery想要生成回调函数本身的名称,以便匹配它传递给您传入的匿名函数的名称,以便在数据返回时调用。因此,在jQuery.getJSON()执行之前函数的名称不可用,并且Facebook认为我的请求由于签名不匹配而导致我的请求不真实(我发送的签名不包含正确的回调参数,因为直到{{ {1}}跑了。)

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

4 个答案:

答案 0 :(得分:3)

唯一为我工作的是以下设置

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

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

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

有关详情,请参阅此处http://docs.jquery.com/Ajax/jQuery.ajax#options

答案 3 :(得分: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'); } );
});

此回调的问题是,您只能在全局注册函数时一次处理一种请求。回调函数可能必须转换为可以检索的不同类型数据的调度程序并调用相应的函数。