à l'aide d'un nom de fonction comme la fonction de rappel pour l' $.getJSON en jQuery pour satisfaire Facebook demande de signature de demandes
J'essaye d'accéder à l'Facebook API Admin.getMetrics méthode via jQuery. Je suis correctement la composition de l'url de la requête sur le serveur (afin de garder mon secret de l'app secret). Je suis ensuite l'envoi de l'url sur le navigateur demande à l'aide jQuery.getJSON()
.
Facebook exige que je vous envoie une copie de toutes mes demandes params haché à ma demande, en secret avec la demande afin de vérifier mon authenticité. Le problème est que jQuery veut générer le nom de la fonction de rappel lui-même afin de faire correspondre le nom qu'il donne à la fonction anonyme que vous transmettez à être appelée lorsque les données de rendement. Par conséquent, le nom de la fonction n'est pas disponible jusqu'à ce que jQuery.getJSON()
exécute et Facebook considère ma demande à être inauthentique en raison d'un mauvais signature (la signature j'envoie le long de ne pas inclure le bon de rappel param parce que ce n'était pas généré jusqu'à ce que jQuery.getJSON()
ran).
La seule façon que je peux penser de ce problème est d'une certaine manière de spécifier le nom de ma fonction à jQuery.getJSON()
plutôt que de le laisser rester dans l'anonymat. Mais je ne trouve aucune option pour le faire en jQuery AP.
OriginalL'auteur Greg Borenstein | 2008-10-14
Vous devez vous connecter pour publier un commentaire.
La seule chose qui a fait le travail pour moi ont été les paramètres suivants
jQuery.ajax({
url: fbookUrl,
dataType: "jsonp",
type: "GET",
cache: true,
jsonp: false,
jsonpCallback: "MyFunctionName" //insert here your function name
});
OriginalL'auteur eloycm
L'utilisation de
jQuery.getScript
s'est avéré être à proximité, mais pas tout à fait, la réponse. À l'aide de getScript élimine jQuery besoin d'ajouter de façon dynamique nommé anonyme en fonction de la demande params (bien que cela soit encore le faire si vous allez de l'avant et de passer une fonction anonyme comme dans le code ci-dessus). Toutefois, la valeur par défaut dansjQuery.getScript
, comme dans tous les autres appels à jQuery Ajax library, est d'ajouter un autre argument supplémentaire_=12344567
(où 1234567 est vraiment un timbre de temps). jQuery fait cela pour empêcher le navigateur de mise en cache de la réponse. Toutefois, ce supplément de me brise signature de la demande comme de l'auto-nommé fonction de rappel.Avec l'aide de #jquery, j'ai appris que la seule façon d'obtenir de jQuery ne pas salir avec votre params est d'en faire la demande à l'aide de la base de
jQuery.Ajax
méthode avec les arguments suivants:(où
fbookUrl
est le Facebook API url je suis en train de demande avec l'ensemble de ses paramètres, y compris la signature et lacallback=myFunction
). LedataType: "script"
arg spécifie que la JSONP devrait être fourré dans une balise de script sur la page pour l'exécution, lacache: true
dit jQuery pour permettre au navigateur de mettre en cache la réponse, c'est à dire de sauter le plus de l'horodatage paramètre.Vrai. De cette façon, juste accomplit deux choses à la fois et ne pas empoisonner le bien pour les autres requêtes Ajax jQuery que je pourrais faire sur la même page.
OriginalL'auteur Greg Borenstein
Vous pouvez passer le JSONP option de $.ajaxSetup qui va vous permettre de régler le nom de la fonction qui est appelée, les docs lire comme suit:
jsonp Chaîne
Remplacer le nom de fonction de rappel dans un jsonp demande. Cette valeur sera utilisée à la place de "rappel" dans la " callback=?' partie de la chaîne de requête dans l'url d'un GET ou les données d'un POST. Donc {jsonp:'onJsonPLoad'} aurait pour résultat de onJsonPLoad=?' transmis au serveur.
Voir ici http://docs.jquery.com/Ajax/jQuery.ajax#options pour plus de détails
La façon JSONP est conçu pour fonctionner en jQuery mandats il génère une dynamique de fonction, le code par la suite le traite comme un script après la création d'une fonction avec la dynamique nom de la fenêtre. Voir ci-dessous post.
OriginalL'auteur Duncan
C'est une meilleure solution avec un fixe de rappel:
Le problème avec cette méthode est que vous ne peut gérer qu'un seul type de demande, au moment que la fonction est enregistré globalement. La fonction de rappel devrait probablement se transformer en un répartiteur pour les différents types de données qu'on peut récupérer et d'appeler la fonction appropriée.
OriginalL'auteur Duncan