usar una función con nombre como devolución de llamada para $ .getJSON en jQuery para satisfacer las demandas de firma de Facebook

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

Pregunta

Estoy intentando acceder al método Admin.getMetrics de la API de Facebook a través de jQuery. Estoy componiendo correctamente la url de solicitud en el lado del servidor (para mantener mi aplicación en secreto). Luego, estoy enviando la url al navegador para que se solicite mediante jQuery.getJSON () .

Facebook requiere que envíe una copia de todos mis parámetros de solicitud con mi secreto de aplicación junto con la solicitud para verificar mi autenticidad. El problema es que jQuery desea 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 se pasa a llamar cuando se devuelven los datos. Por lo tanto, el nombre de la función no está disponible hasta que jQuery.getJSON () se ejecute y Facebook considere 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 eso no se generó hasta que jQuery.getJSON () se ejecutó).

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

¿Fue útil?

Solución 2

El uso de jQuery.getScript resultó ser cerca, pero no del todo, de la respuesta. El uso de getScript elimina la necesidad de jQuery de agregar la función anónima dinámicamente nombrada a los parámetros de solicitud (aunque todavía lo hará si sigue adelante 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 demás llamadas en la biblioteca Ajax de jQuery, es agregar un argumento adicional adicional _ = 12344567 (donde 1234567 es realmente un sello de tiempo). jQuery hace esto para evitar que el navegador almacene 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 con nombre automático.

Con un poco de ayuda en #jquery, aprendí que la única forma de que jQuery no se meta con sus parámetros es realizar la solicitud utilizando el método básico jQuery.Ajax con los siguientes argumentos :

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

(donde fbookUrl es la URL de la API de Facebook que estoy tratando de solicitar con sus parámetros completos, que incluyen la firma y la devolución de llamada = myFunction ). El dataType: " script " arg especifica que el JSONP resultante debe rellenarse en una etiqueta de script en la página para su ejecución, cache: true le dice a jQuery que permita que el navegador caché la respuesta, es decir, para omitir la adición del parámetro de marca de tiempo.

Otros consejos

Lo único que hizo el trabajo por mí fueron las siguientes configuraciones

jQuery.ajax ({   url: fbookUrl,   tipo de datos: " jsonp " ;,   escriba: " GET " ;,   caché: verdadero,   jsonp: falso,   jsonpCallback: " MyFunctionName " // inserta aquí tu nombre de función });

Puede pasar la opción JSONP a $ .ajaxSetup que le permitirá corregir el nombre de la función a la que se llama, la documentación dice lo siguiente:

Cadena jsonp
Reemplace el nombre de la función de devolución de llamada en una solicitud jsonp. Este valor se utilizará en lugar de 'devolución de llamada' en el 'devolución de llamada =?' parte de la cadena de consulta en la url para un GET o los datos para un POST. Entonces {jsonp: 'onJsonPLoad'} resultaría en 'onJsonPLoad =?' Pasado al servidor.

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

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 se registra 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top