eine benannte Funktion als Callback für $ .getJSON in jQuery mit Facebook Anfrage Unterzeichnung Anforderungen gerecht zu werden

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

Frage

Ich versuche, die Facebook-API Admin.getMetrics Methode über jQuery zugreifen. Ich Komponieren richtig die Anforderungs-URL auf der Serverseite (um meine app Geheimnis geheim zu halten). Ich bin dann die URL über an den Browser sendet Anfrage mit jQuery.getJSON() werden.

Facebook verlangt, dass ich eine Kopie aller meiner Anfrage params gehasht mit meiner Anwendung Geheimnis zusammen mit der Anforderung senden, um meine Echtheit zu überprüfen. Das Problem ist, dass jQuery will den Namen der Callback-Funktion selbst erzeugen, um den Namen an die anonyme Funktion aufgerufen werden Sie passieren in gibt übereinstimmen, wenn die Daten zurückgibt. Daher ist der Name der Funktion nicht zur Verfügung, bis jQuery.getJSON() ausführt und Facebook hält meine Anfrage unecht sein aufgrund einer nicht übereinstimmen Signatur (die Unterschrift I zusammen nicht den richtigen Rückruf param enthalten schickt, weil das nicht generiert wurde, bis jQuery.getJSON() lief).

Der einzige Weg, ich aus diesem Problem denken kann, ist irgendwie den Namen meiner Funktion angeben, statt jQuery.getJSON() ermöglicht es, anonym zu bleiben. Aber ich kann keine Option finden so in der jQuery AP tun.

War es hilfreich?

Lösung 2

Die Verwendung von jQuery.getScript stellte sich heraus, nahe zu sein - aber nicht ganz - die Antwort. Mit getScript eliminiert jQuery Notwendigkeit, die dynamisch benannt anonyme Funktion auf die Anfrage params hinzuzufügen (obwohl es immer noch tun, wenn Sie voran gehen und es eine anonyme Funktion wie in dem obigen Code bekommen). Allerdings ist die Standardeinstellung in jQuery.getScript, wie in allen anderen Anrufe in jQuery Ajax-Bibliothek, ein weiteres zusätzliches Argument _=12344567 anhängen (wo 1234567 wirklich ein Zeitstempel ist). jQuery tut dies um den Browser zu verhindern, dass das Caching die Antwort. Doch diese zusätzlichen Pausen meine Unterzeichnung des Antrags genau wie die Auto-Name Callback-Funktion.

Mit etwas Hilfe auf #jquery, erfuhr ich, dass der einzige Weg, jQuery nicht zu verwirren bekommen überhaupt mit Ihrem params ist die Anforderung mit der Basis jQuery.Ajax Methode mit den folgenden Argumenten zu machen:

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

(wobei fbookUrl ist die Facebook-API-URL Ich versuche, mit seinem vollen params einschließlich der Unterzeichnung und der callback=myFunction zu beantragen). Die dataType: "script" arg gibt an, dass die resultierende JSONP sollte für die Ausführung, cache: true erzählt jQuery auf der Seite in einen Script-Tag gestopft werden, um dem Browser zu ermöglichen, die Antwort cachen, das heißt die Zugabe der Zeitstempel-Parameter zu überspringen.

Andere Tipps

Das einzige, was die Arbeit für mich getan hat waren die folgenden Einstellungen

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

Sie können die JSONP Option auf $ .ajaxSetup passieren, dass Sie den Namen der Funktion beheben können, dass die Dokumentation aufgerufen wird wie folgt lauten:

JSONP String
Überschreiben Sie die Callback-Funktion Namen in einem JSONP Anfrage. Dieser Wert wird anstelle von ‚Rückruf‘ in der verwendet wird ‚Rückruf =?‘ Teil der Abfrage-String in der URL für ein GET oder die Daten für eine POST. So {JSONP: 'onJsonPLoad'} würde in 'onJsonPLoad =?' an den Server übergeben.

Sehen Sie hier http://docs.jquery.com/Ajax/jQuery.ajax #OPTIONS für weitere Details

Dies ist eine bessere Lösung mit einem festen Rückruf:

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

Das Problem bei diesem Rückruf ist, dass Sie nur eine Art von Anfrage zu einem Zeitpunkt verarbeiten können als die Funktion global registriert ist. Die Callback-Funktion würde wahrscheinlich in einem Dispatcher drehen haben für die verschiedenen Arten von Daten, die sie abrufen können und die entsprechende Funktion aufrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top