usando uma função chamada como o retorno de chamada por US $ .getJSON em jQuery para satisfazer Facebook solicitação de assinatura de demandas

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

Pergunta

Estou tentando acessar o método Facebook API Admin.getMetrics via jQuery. Estou compondo corretamente a url pedido no lado do servidor (a fim de manter meu aplicativo segredo segredo). Estou em seguida, enviar a url para o navegador a ser pedido através jQuery.getJSON().

Facebook exige que eu enviar uma cópia de todos os meus parâmetros de solicitação de hash com o meu segredo aplicação, juntamente com o pedido, a fim de verificar a minha autenticidade. O problema é que jQuery quer gerar o nome da função de retorno em si, a fim de coincidir com o nome dá à função anônima que se passa em ser chamado quando os retornos de dados. Portanto, o nome da função não está disponível até executa jQuery.getJSON() e Facebook considera o meu pedido para ser inautêntica devido a uma assinatura incompatível (a assinatura I enviar junto não inclui o parâmetro de retorno de chamada correta porque que não foi gerado até correu jQuery.getJSON()).

A única maneira que eu posso pensar em sair deste problema é especificar alguma forma o nome da minha função para jQuery.getJSON() em vez de permitir que ele permaneça anônimo. Mas eu não consigo encontrar nenhuma opção para fazê-lo no jQuery AP.

Foi útil?

Solução 2

O uso de jQuery.getScript acabou por ser perto - mas não completamente - a resposta. Usando getScript elimina a necessidade do jQuery para adicionar a função anônima chamada dinamicamente para os parâmetros de solicitação (embora ele ainda vai fazer isso se você vá em frente e passar uma função anônima como no código acima). No entanto, o padrão no jQuery.getScript, como em todas as outras chamadas na biblioteca Ajax do jQuery, é acrescentar mais uma _=12344567 argumento adicional (onde 1234567 é realmente um carimbo de tempo). jQuery faz isso para evitar que o navegador cache a resposta. No entanto, este breaks adicionais minha assinatura do pedido assim como a função de retorno de nome automático.

Com alguma ajuda em #jquery, eu aprendi que a única maneira de obter jQuery para não mexer em tudo com os seus parâmetros é fazer a solicitação usando o método base jQuery.Ajax com os seguintes argumentos:

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

(onde fbookUrl é a API url Facebook Estou tentando pedido com seus completos parâmetros, incluindo a assinatura eo callback=myFunction). Os especifica dataType: "script" arg que o JSONP resultante deve ser colocado em uma tag script na página para execução, cache: true diz jQuery para permitir que o navegador para armazenar em cache a resposta, ou seja, para ignorar a adição do parâmetro carimbo de tempo.

Outras dicas

A única coisa que fez o trabalho para mim foram as seguintes configurações

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

Você pode passar a opção JSONP para US $ .ajaxSetup que lhe permitirá corrigir o nome da função que é chamado, os docs ter a seguinte redacção:

jsonp Cordas
Substituir o nome da função de retorno de chamada em um pedido jsonp. Este valor será usado em vez de 'retorno' no 'callback =? parte da string de consulta na URL para um GET ou os dados para um POST. Então {jsonp: 'onJsonPLoad'} resultaria em '? OnJsonPLoad =' passado para o servidor.

Veja aqui http://docs.jquery.com/Ajax/jQuery.ajax #options para mais detalhes

Esta é uma solução melhor com um retorno fixo:

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

O problema com este callback é que você só pode lidar com um tipo de solicitação de cada vez que a função é globalmente registrado. A função de retorno provavelmente teria de se transformar em um despachante para os diferentes tipos de dados que poderia recuperar e chamar a função apropriada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top