使用命名函数作为jQuery中$ .getJSON的回调来满足Facebook请求签名要求
-
03-07-2019 - |
题
我正在尝试通过jQuery访问Facebook API Admin.getMetrics方法。我正确地在服务器端编写请求URL(为了保密我的应用程序秘密)。我然后使用 jQuery.getJSON()
将URL发送到浏览器以进行请求。
Facebook要求我发送我的所有请求参数的副本以及我的应用程序密码和请求,以验证我的真实性。问题是jQuery想要生成回调函数本身的名称,以便匹配它传递给您传入的匿名函数的名称,以便在数据返回时调用。因此,在 jQuery.getJSON()
执行之前,函数的名称不可用,并且Facebook认为我的请求由于签名不匹配而不真实(我发送的签名不包括正确的回调参数)因为直到 jQuery.getJSON()
运行才生成。
我能想到这个问题的唯一方法是以某种方式将我的函数名称指定为 jQuery.getJSON()
,而不是让它保持匿名。但我在jQuery AP中找不到任何选择。
解决方案 2
jQuery.getScript
的使用证明是接近 - 但并不完全 - 答案。使用getScript消除了jQuery需要将动态命名的匿名函数添加到请求参数中(尽管如果继续并将其传递给上面的代码中的匿名函数,它仍然会这样做)。但是, jQuery.getScript
中的默认值,就像在jQuery的Ajax库中的所有其他调用一样,是追加另一个参数 _ = 12344567
(其中1234567实际上是时间戳)。 jQuery这样做是为了防止浏览器缓存响应。但是,这个附加功能会破坏我对请求的签名,就像自动命名的回调函数一样。
在#jquery上有一些帮助,我了解到让jQuery完全不使用params的唯一方法是使用带有以下参数的base jQuery.Ajax
方法发出请求:
jQuery.ajax({
url: fbookUrl,
dataType: "script",
type: "GET",
cache: true,
callback: null,
data: null
});
(其中 fbookUrl
是我试图通过其完整参数请求的Facebook API网址,包括签名和 callback = myFunction
)。 dataType:" script"
arg指定生成的JSONP应填充到页面上的脚本标记中以供执行, cache:true
告诉jQuery允许浏览器缓存响应,即跳过添加时间戳参数。
其他提示
唯一为我工作的是以下设置
<代码> jQuery.ajax({ url:fbookUrl, dataType:&quot; jsonp&quot;, 类型:“GET”, cache:true, jsonp:false, jsonpCallback:“MyFunctionName” //在这里输入您的函数名称 }); 代码>
您可以将JSONP选项传递给$ .ajaxSetup,以允许您修复被调用的函数名称,文档内容如下:
jsonp String
覆盖jsonp请求中的回调函数名称。在'callback =?'中将使用此值代替'callback' GET的url中的查询字符串的一部分或POST的数据。所以{jsonp:'onJsonPLoad'}会导致'onJsonPLoad =?'传递给服务器。
请参阅此处 http://docs.jquery.com/Ajax/jQuery.ajax #options 了解更多详情
这是一个更好的解决方案,具有固定的回调:
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'); } );
});
此回调的问题是,您只能在全局注册函数时一次处理一种请求。回调函数可能必须转换为可以检索的不同类型数据的调度程序并调用适当的函数。