использование именованной функции в качестве обратного вызова для $.getJSON в jQuery для удовлетворения требований подписи запроса Facebook

StackOverflow https://stackoverflow.com/questions/203194

Вопрос

Я пытаюсь получить доступ к методу Admin.getMetrics API Facebook через jQuery.Я правильно составляю URL-адрес запроса на стороне сервера (чтобы сохранить секретность моего приложения).Затем я отправляю URL-адрес в браузер для запроса, используя jQuery.getJSON().

Facebook требует, чтобы я отправил копию всех параметров моего запроса, хешированных с секретом моего приложения, вместе с запросом, чтобы проверить мою подлинность.Проблема в том, что jQuery хочет сгенерировать имя самой функции обратного вызова, чтобы оно соответствовало имени, которое она дает анонимной функции, которую вы передаете для вызова при возврате данных.Поэтому имя функции недоступно до тех пор, пока jQuery.getJSON() выполняется, и Facebook считает мой запрос недостоверным из-за несоответствующей подписи (подпись, которую я отправляю, не включает правильный параметр обратного вызова, поскольку она не была сгенерирована до тех пор, пока jQuery.getJSON() побежал).

Единственный способ решить эту проблему, который я могу придумать, — это как-то указать имя моей функции для jQuery.getJSON() вместо того, чтобы позволить ему оставаться анонимным.Но я не могу найти никакой возможности сделать это в jQuery AP.

Это было полезно?

Решение 2

Использование jQuery.getScript оказался близок к ответу, но не совсем.Использование getScript избавляет jQuery от необходимости добавлять анонимную функцию с динамическим именем к параметрам запроса (хотя он все равно сделает это, если вы передадите ему анонимную функцию, как в приведенном выше коде).Однако по умолчанию в jQuery.getScript, как и во всех других вызовах библиотеки Ajax jQuery, необходимо добавить дополнительный аргумент _=12344567 (где 1234567 на самом деле является меткой времени).jQuery делает это, чтобы браузер не кэшировал ответ.Однако это дополнение нарушает подписание запроса, как и функция обратного вызова с автоматическим именем.

С помощью #jquery я узнал, что единственный способ заставить jQuery вообще не вмешиваться в ваши параметры — это выполнить запрос, используя базу jQuery.Ajax метод со следующими аргументами:

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

(где fbookUrl — это URL-адрес Facebook API, который я пытаюсь запросить, с его полными параметрами, включая подпись и callback=myFunction).А dataType: "script" arg указывает, что полученный JSONP должен быть помещен в тег скрипта на странице для выполнения, cache: true сообщает jQuery, чтобы браузер мог кэшировать ответ, т.е.чтобы пропустить добавление параметра отметки времени.

Другие советы

Единственное, что мне помогло, это следующие настройки

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

Вы можете передать параметр JSONP в $.ajaxSetup, который позволит вам исправить имя вызываемой функции. Документы читаются следующим образом:

jsonp строка
Переопределить имя функции обратного вызова в запросе jsonp.Это значение будет использоваться вместо «обратного вызова» в «обратном обращении =?» Часть строки запроса в URL для получения или данных для поста.Так что {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'); } );
});

Проблема с этим обратным вызовом заключается в том, что вы можете одновременно обрабатывать только один тип запроса, поскольку функция зарегистрирована глобально.Функция обратного вызова, вероятно, должна будет превратиться в диспетчера для различных типов данных, которые она может получить, и вызвать соответствующую функцию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top