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

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

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

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

Ответы [ 4 ]

3 голосов
/ 18 мая 2011

Единственное, что сработало для меня, были следующие настройки

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

2 голосов
/ 15 октября 2008

Использование 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-адрес API Facebook, который я пытаюсь запросить с полными параметрами, включая подпись и callback=myFunction). Аргумент dataType: "script" указывает, что полученный JSONP должен быть вставлен в тег сценария на странице для выполнения, cache: true указывает jQuery разрешить браузеру кэшировать ответ, то есть пропустить добавление параметра метки времени.

1 голос
/ 15 октября 2008

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

JSONP String
Переопределите имя функции обратного вызова в запросе jsonp. Это значение будет использоваться вместо callback в callback =? часть строки запроса в URL для GET или данные для POST. Так что {jsonp: 'onJsonPLoad'} приведет к 'onJsonPLoad =?' перешел на сервер.

Подробнее см. Здесь http://docs.jquery.com/Ajax/jQuery.ajax#options

0 голосов
/ 15 октября 2008

Это лучшее решение с фиксированным обратным вызовом:

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'); } );
});

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

...