utilizzando una funzione denominata come callback per $ .getJSON in jQuery per soddisfare le richieste di firma delle richieste di Facebook

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

Domanda

Sto provando ad accedere al metodo Admin.getMetrics dell'API di Facebook tramite jQuery. Sto componendo correttamente l'URL della richiesta sul lato server (al fine di mantenere segreta la mia app). Sto quindi inviando l'URL al browser per essere richiesto utilizzando jQuery.getJSON () .

Facebook richiede che io invii una copia di tutti i miei parametri di richiesta hash con il segreto della mia applicazione insieme alla richiesta per verificare la mia autenticità. Il problema è che jQuery vuole generare il nome della funzione di callback stessa per abbinare il nome che dà alla funzione anonima in cui si passa per essere richiamati quando i dati ritornano. Pertanto, il nome della funzione non è disponibile fino a quando jQuery.getJSON () non viene eseguito e Facebook considera la mia richiesta non autentica a causa di una firma non corrispondente (la firma che invio non include il parametro di callback corretto perché non è stato generato fino a quando jQuery.getJSON () non è stato eseguito).

L'unico modo in cui riesco a pensare a questo problema è in qualche modo specificare il nome della mia funzione su jQuery.getJSON () invece di consentire che rimanga anonimo. Ma non riesco a trovare alcuna opzione per farlo in AP jQuery.

È stato utile?

Soluzione 2

L'uso di jQuery.getScript si è rivelato vicino - ma non del tutto - alla risposta. L'uso di getScript elimina la necessità di jQuery di aggiungere la funzione anonima con nome dinamico ai parametri della richiesta (anche se continuerà a farlo se si procede e si passa una funzione anonima come nel codice sopra). Tuttavia, l'impostazione predefinita in jQuery.getScript , come in tutte le altre chiamate nella libreria Ajax di jQuery, è di aggiungere un ulteriore argomento aggiuntivo _ = 12344567 (dove 1234567 è davvero un timestamp). jQuery fa questo per impedire al browser di memorizzare nella cache la risposta. Tuttavia, questo ulteriore interrompe la mia firma della richiesta proprio come la funzione di richiamata con nome automatico.

Con un po 'di aiuto su #jquery, ho imparato che l'unico modo per evitare che jQuery non rovini affatto i tuoi parametri è di effettuare la richiesta usando il metodo di base jQuery.Ajax con i seguenti argomenti :

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

(dove fbookUrl è l'URL dell'API di Facebook che sto cercando di richiedere con i suoi parametri completi tra cui la firma e il callback = myFunction ). L'arg dataType: " script " specifica che il JSONP risultante deve essere inserito in un tag di script nella pagina per l'esecuzione, cache: true dice a jQuery di consentire al browser di memorizza nella cache la risposta, ovvero per saltare l'aggiunta del parametro timestamp.

Altri suggerimenti

L'unica cosa che ha funzionato per me sono state le seguenti impostazioni

jQuery.ajax ({   url: fbookUrl,   dataType: " jsonp " ;,   tipo: " OTTIENI " ;,   cache: true,   jsonp: false,   jsonpCallback: " MyFunctionName " // inserisci qui il nome della tua funzione });

Puoi passare l'opzione JSONP a $ .ajaxSetup che ti permetterà di correggere il nome della funzione che viene chiamato, i documenti leggono come segue:

jsonp String
Sostituisci il nome della funzione di richiamata in una richiesta jsonp. Questo valore verrà utilizzato al posto di "callback" in "callback =?" parte della stringa di query nell'URL per un GET o i dati per un POST. Quindi {jsonp: 'onJsonPLoad'} si tradurrebbe in 'onJsonPLoad =?' passato al server.

Vedi qui http://docs.jquery.com/Ajax/jQuery.ajax #opzioni per maggiori dettagli

Questa è una soluzione migliore con un callback fisso:

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

Il problema con questo callback è che puoi gestire un solo tipo di richiesta alla volta poiché la funzione è registrata a livello globale. La funzione di callback dovrebbe probabilmente trasformarsi in un dispatcher per i diversi tipi di dati che potrebbe recuperare e chiamare la funzione appropriata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top