2010-07-28 20 views
23

Sto utilizzando jquery per creare una richiesta all'API di ricerca di Twitter. Sto usando jsonp, come è necessario per le richieste tra domini. Tuttavia, l'API di Twitter specifica che è necessario impostare un agente utente univoco per queste richieste e limita le richieste in caso contrario. Il problema è che non vedo il modo di impostare questa intestazione via jquery.Modifica intestazioni HTTP per una richiesta JSONP

Questo è il codice che sto usando:

$.ajax({ 
    url: 'http://search.twitter.com/search.json', 
    dataType: 'jsonp', 
    type: 'get', 
    data: { q: 'twitter' }, 
    success: function(data) { 
     alert(data.results); 
    } 
}); 

Ho provato con il metodo beforeSend, ma sembra che questo evento non sta sparando. Qualcuno può trovare un modo per risolvere questo problema?

Grazie.

risposta

52

JSON con Padding funziona aggiungendo un elemento di script alla pagina, con l'attributo src che punta all'URL del servizio web. Il servizio Web restituisce quindi uno script contenente i dati racchiusi in una funzione di callback che viene eseguita quando lo script termina l'analisi. Non è tanto JSON (non deve nemmeno essere JSON valido, per cominciare) in quanto è Plain JavaScript.

Non c'è modo di modificare le intestazioni inviate per un elemento di script aggiunto alla pagina, sfortunatamente. L'unica cosa che puoi fare è verificare la presenza di un metodo compatibile cross-origine del recupero dei dati, come ad esempio:

  • XMLHttpRequest Level 2 - Chrome, Safari 4+, Firefox 3.5+, Opera

    // Is XMLHttpRequest Level 2 supported? 
    if ("withCredentials" in new XMLHttpRequest())
  • XDomainRequest - per IE 8, IE 9

    // Is XDomainRequest supported? 
    if ("XDomainRequest" in window)

sarebbe una buona idea testare queste implementazioni se esistono e usarle di conseguenza, ricadendo su JSONP standard per browser non supportati o precedenti.

È anche possibile (ma improbabile, dal momento che è di alto profilo) che il servizio Web non sia impostato per consentire le richieste di origine incrociata, quindi è possibile che sia necessario tornare a JSONP se la richiesta non riesce. Vedi anche, Cross-Origin Resource Sharing.

+1

+1 bella risposta dettagliata con informazioni utili :) – Sarfraz

+1

Ah, che è incredibilmente sfortunata. Penso che tornerò a utilizzare uno script wrapper scritto in PHP che esce e ottiene i dati. In questo modo, posso memorizzare nella cache la ricerca, quindi forse è un vantaggio reciproco (anche se significa più lavoro). Grazie per la risposta dettagliata. –

0

Prova questo:

// OAuth configurations 
    var config = { 
     'client_id': 'xxxxxx.apps.googleusercontent.com', 
     'scope': 'https://www.google.com/m8/feeds/contacts/default/full'   
    }; 

gapi.auth.authorize(config, function(data) { 
     // login complete - now get token 
     var token = gapi.auth.getToken(); 
     token.alt = 'json'; 
     // retrieve contacts 
     jQuery.ajax({ 
     url: 'https://www.google.com/m8/feeds/contacts/default/full/?max-results=999999', 
     dataType: 'jsonp', 
     data: token, 
     success: function(data) { successGmail(data); } 
     }); 
    }); 

ho trovato lì: https://groups.google.com/d/msg/google-api-javascript-client/GuFxPzqQ9-0/hZpo041UaH4J

Problemi correlati