Единственное, что сделало для меня работу, следующие настройки
jQuery.ajax({ url: fbookUrl, dataType: "jsonp", type: "GET", cache: true, jsonp: false, jsonpCallback: "MyFunctionName" //insert here your function name });
Я пытаюсь получить доступ к API API Admin.getMetrics через jQuery. Я правильно составляю URL-адрес запроса на стороне сервера (чтобы тайно хранить свое приложение). Затем я отправляю URL-адрес в браузер для запроса jQuery.getJSON()
.
Facebook требует, чтобы я отправил копию всех моих параметров запроса, хэшированных с моим секретариатом приложения, вместе с запросом, чтобы проверить мою подлинность. Проблема состоит в том, что jQuery хочет сгенерировать имя самой функции обратного вызова, чтобы соответствовать имени, которое он дает анонимной функции, которую вы передаете, для вызова при возврате данных. Поэтому имя функции недоступно до тех пор, пока выполнение не будет выполнено, jQuery.getJSON()
и Facebook считает мой запрос недостоверным из-за несогласованной подписи (подпись, которую я отправляю, не включает правильный параметр обратного вызова, поскольку он не был сгенерирован до jQuery.getJSON()
запуска).
Единственный способ, который я могу решить из этой проблемы, - это как-то указать имя моей функции jQuery.getJSON()
вместо того, чтобы позволить ей оставаться анонимной. Но я не могу найти какой-либо вариант для этого в jQuery AP.
javascript,jquery,json,facebook,jsonp,
Использование 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 , чтобы позволить браузеру кэшировать ответ, то есть , чтобы пропустить добавление параметра метки времени.
Вы можете передать параметр JSONP в $ .ajaxSetup, который позволит вам исправить имя функции, которое вызывается, документы читаются следующим образом:
jsonp String
Переопределить имя функции обратного вызова в запросе jsonp. Это значение будет использоваться вместо «обратного вызова» в «обратном вызове =?» часть строки запроса в URL-адресе для GET или данных для 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'); } );
});
Проблема с этим обратным вызовом заключается в том, что вы можете обрабатывать только один вид запроса одновременно, поскольку функция зарегистрирована глобально. Функция обратного вызова, вероятно, должна была бы превратиться в диспетчер для различных видов данных, которые он мог бы получить, и вызвать соответствующую функцию.