2008-10-14 3 views
3

J'essaye d'accéder à la méthode Facebook API.getMetrics via jQuery. Je suis en train de composer correctement l'URL de la requête côté serveur (afin de garder mon application secrète secrète). J'envoie alors l'url au navigateur pour être demande en utilisant jQuery.getJSON(). Facebook exige que j'envoie une copie de tous mes paramètres de requête hachés avec mon application secrète 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 faire correspondre le nom donné à la fonction anonyme que vous passez pour être appelée lorsque les données retournent. Par conséquent, le nom de la fonction n'est pas disponible jusqu'à ce que jQuery.getJSON() s'exécute et Facebook considère que ma demande est inauthentique en raison d'une signature non concordante (la signature que j'envoie n'inclut pas le bon paramètre de rappel car cela n'a pas été généré avant le jQuery.getJSON()).

La seule façon que je peux penser à ce problème est de spécifier en quelque sorte le nom de ma fonction à jQuery.getJSON() au lieu de lui permettre de rester anonyme. Mais je ne trouve aucune option pour le faire dans le point d'accès jQuery.

Répondre

2

L'utilisation de jQuery.getScript s'est avérée proche de - mais pas tout à fait - la réponse. L'utilisation de getScript élimine le besoin de jQuery d'ajouter la fonction anonyme nommée dynamiquement aux paramètres de requête (bien qu'elle le fasse quand même si vous allez de l'avant et lui transmettez une fonction anonyme comme dans le code ci-dessus). Toutefois, 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 un horodatage). jQuery fait cela pour empêcher le navigateur de mettre en cache la réponse. Cependant, cet ajout interrompt ma signature de la demande tout comme la fonction de rappel automatique.

Avec un peu d'aide sur #jquery, j'ai appris que la seule façon d'obtenir jQuery pas gâcher du tout avec vos params est de faire la demande en utilisant la méthode de base 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 j'essaie de demander avec ses paramètres complets, y compris la signature et le callback=myFunction). L'argument dataType: "script" spécifie que le JSONP résultant doit être placé dans une balise de script sur la page pour exécution, cache: true indique à jQuery de permettre au navigateur de mettre en cache la réponse, c'est-à-direpour ignorer l'ajout du paramètre d'horodatage.

+0

en ajoutant $ .ajaxSetup ({cache: true}); n'importe où avant qu'un appel à getScript supprime également le paramètre _ = 12344567. – Duncan

+0

True. Cette façon de faire accomplit les deux choses à la fois et n'empoisonne pas les autres requêtes jQuery Ajax que je pourrais faire sur la même page. –

1

Vous pouvez passer l'option JSONP à .ajaxSetup $ qui vous permettra de fixer le nom de la fonction qui est appelée, les documents se lisent comme suit:

jsonp Chaîne
Remplacer le nom de la fonction de rappel dans un demande jsonp. Cette valeur sera utilisée à la place de 'callback' dans le 'callback =?' partie de la chaîne de requête dans l'URL pour un GET ou les données pour 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

+0

qui ne résout pas vraiment le problème mais parce que jQuery indiquera générer un nom arbitraire pour la fonction anonyme qui vit sur la l'autre côté de ce point d'interrogation et par conséquent ma demande signée échouera parce que les paramètres ne correspondront pas à ce que je signais. –

+0

La façon dont JSONP est conçu pour fonctionner dans jQuery impose qu'il génère une fonction dynamique, le code la traite ensuite comme un script après la création d'une fonction avec le nom dynamique sur la fenêtre. Voir le message ci-dessous. – Duncan

0

Ceci est 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 gérer une sorte de demande à un moment où la La fonction est globalement enregistrée. La fonction de rappel devrait probablement devenir un répartiteur pour les différents types de données qu'elle pourrait récupérer et appeler la fonction appropriée.

3

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

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

Questions connexes