utiliser une fonction nommée comme rappel de $ .getJSON dans jQuery pour satisfaire les demandes de signature de requêtes de Facebook

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

Question

J'essaie d'accéder à la méthode Admin.getMetrics de l'API Facebook via jQuery. Je compose correctement l'URL de la demande côté serveur (afin de garder le secret sur mon application). J'envoie ensuite l'URL au navigateur pour qu'il demande à l'aide de jQuery.getJSON () .

Facebook exige que j'envoie une copie de tous mes paramètres de demande hachés avec le secret de mon application 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 elle-même afin de correspondre au nom qu’il donne à la fonction anonyme que vous transmettez pour être appelée lorsque les données sont renvoyées. Par conséquent, le nom de la fonction n'est pas disponible jusqu'à ce que jQuery.getJSON () soit exécuté et que Facebook considère que ma demande est inauthentique en raison d'une signature incompatible. car cela n'a pas été généré jusqu'à ce que jQuery.getJSON () soit exécuté).

La seule façon de penser à ce problème est de spécifier le nom de ma fonction dans jQuery.getJSON () au lieu de lui permettre de rester anonyme. Mais je ne trouve aucune option pour le faire dans l’AP jQuery.

Était-ce utile?

La solution 2

L’utilisation de jQuery.getScript s’est avérée proche, mais pas tout à fait, de la réponse. L'utilisation de getScript élimine le besoin de jQuery d'ajouter la fonction anonyme nommée de manière dynamique aux paramètres de la requête (même si cela sera toujours le cas si vous lui transmettez une fonction anonyme comme dans le code ci-dessus). Cependant, la valeur par défaut dans jQuery.getScript , comme dans tous les autres appels de la bibliothèque Ajax de jQuery, consiste à ajouter un autre argument supplémentaire _ = 12344567 (où 1234567 est réellement horodatage). jQuery fait cela pour empêcher le navigateur de mettre en cache la réponse. Cependant, cette opération supplémentaire interrompt ma signature de la demande, tout comme la fonction de rappel nommée automatiquement.

Avec un peu d'aide sur #jquery, j'ai appris que le seul moyen d'éviter à jQuery de gâcher vos paramètres est de faire la requête à l'aide de la méthode jQuery.Ajax avec les arguments suivants :

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

(où fbookUrl est l'URL de l'API Facebook que je tente de demander avec ses paramètres complets, y compris la signature et le callback = myFunction ). Le paramètre dataType: " script " indique que le fichier JSONP résultant doit être inséré dans une balise de script de la page, cache: true indique à jQuery d'autoriser le navigateur. mettre en cache la réponse, c'est-à-dire ignorer l'ajout du paramètre d'horodatage.

Autres conseils

La seule chose qui a fait le travail pour moi était les paramètres suivants

jQuery.ajax ({   url: fbookUrl,   dataType: " jsonp " ;,   type: "GET",   cache: true,   jsonp: faux,   jsonpCallback: " MyFunctionName " // insère ici le nom de ta fonction });

Vous pouvez passer l'option JSONP à $ .ajaxSetup qui vous permettra de corriger le nom de la fonction appelée, la documentation se lit comme suit:

Chaîne jsonp
Remplacez le nom de la fonction de rappel dans une demande jsonp. Cette valeur sera utilisée à la place de 'callback' dans 'callback =?' une partie de la chaîne de requête dans l'URL d'un GET ou les données d'un POST. Donc, {jsonp: 'onJsonPLoad'} donnerait 'onJsonPLoad =?' passé au serveur.

Voir ici http://docs.jquery.com/Ajax/jQuery.ajax #options pour plus de détails

Il s'agit d'une meilleure solution avec un rappel fixe:

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

Le problème avec ce rappel est que vous ne pouvez traiter qu'un type de demande à la fois car la fonction est enregistrée globalement. La fonction de rappel devrait probablement se transformer en répartiteur pour les différents types de données qu’elle pourrait récupérer et appeler la fonction appropriée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top