utilizando una función nombrada como devolución de llamada para $ .getJSON en jQuery para satisfacer las demandas de firma de solicitudes de Facebook

votos
3

Estoy intentando acceder al método Admin.getMetrics de la API de Facebook a través de jQuery. Estoy redactando correctamente la url de solicitud en el lado del servidor (para mantener mi aplicación en secreto). Luego envío la url al navegador para solicitarla jQuery.getJSON().

Facebook requiere que envíe una copia de todos mis params de solicitud codificados con el secreto de mi aplicación junto con la solicitud para verificar mi autenticidad. El problema es que jQuery quiere generar el nombre de la función de devolución de llamada para que coincida con el nombre que le da a la función anónima que pasa para que se llame cuando los datos vuelvan. Por lo tanto, el nombre de la función no está disponible hasta que se jQuery.getJSON()ejecuta y Facebook considera que mi solicitud no es auténtica debido a una firma no coincidente (la firma que envío no incluye el parámetro de devolución de llamada correcto porque no se generó hasta que se jQuery.getJSON()ejecutó).

La única forma en que puedo pensar en este problema es especificar de alguna manera el nombre de mi función en jQuery.getJSON()lugar de permitir que permanezca en el anonimato. Pero no puedo encontrar ninguna opción para hacerlo en el jQuery AP.

Publicado el 15/10/2008 a las 00:21
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
1

Puede pasar la opción JSONP a $ .ajaxSetup que le permitirá corregir el nombre de la función que se llama, los documentos se leen de la siguiente manera:

cadena jsonp Anula
el nombre de la función de devolución de llamada en una solicitud jsonp. Este valor se usará en lugar de 'devolución de llamada' en 'callback =?' parte de la cadena de consulta en la url para un GET o los datos para un POST. Entonces {jsonp: 'onJsonPLoad'} daría como resultado 'onJsonPLoad =?' pasado al servidor.

Vea aquí http://docs.jquery.com/Ajax/jQuery.ajax#options para más detalles

Respondida el 15/10/2008 a las 00:47
fuente por usuario

votos
0

Esta es una mejor solución con una devolución de llamada fija:

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

El problema con esta devolución de llamada es que solo puede manejar un tipo de solicitud a la vez ya que la función está registrada globalmente. La función de devolución de llamada probablemente tendría que convertirse en un despachador para los diferentes tipos de datos que podría recuperar y llamar a la función apropiada.

Respondida el 15/10/2008 a las 16:26
fuente por usuario

votos
2

El uso de jQuery.getScriptresultó ser cercano, pero no del todo, la respuesta. El uso de getScript elimina la necesidad de jQuery de agregar la función anónima llamada dinámicamente a los parámetros de solicitud (aunque seguirá haciéndolo si continúa y le pasa una función anónima como en el código anterior). Sin embargo, el valor predeterminado en jQuery.getScript, como en todas las otras llamadas en la biblioteca Ajax de jQuery, es agregar un argumento adicional adicional _=12344567(donde 1234567 es realmente una marca de tiempo). jQuery hace esto para evitar que el navegador guarde en caché la respuesta. Sin embargo, este adicional rompe mi firma de la solicitud al igual que la función de devolución de llamada automática.

Con algo de ayuda en #jquery, aprendí que la única forma de que jQuery no se meta en absoluto con tus parámetros es hacer la solicitud usando el jQuery.Ajaxmétodo base con los siguientes argumentos:

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

(¿Dónde fbookUrlestá la URL de la API de Facebook que estoy tratando de solicitar con sus parámetros completos, incluida la firma y la callback=myFunction). El dataType: "script"arg especifica que el JSONP resultante debe incluirse en una etiqueta de script en la página para su ejecución, cache: truele dice a jQuery que permita que el navegador guarde en caché la respuesta, es decir, omita la adición del parámetro de marca de tiempo.

Respondida el 15/10/2008 a las 17:12
fuente por usuario

votos
3

La única cosa que hizo el trabajo para mí fueron los siguientes ajustes

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

Respondida el 18/05/2011 a las 13:30
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more