2010-07-28 54 views
23

Estoy usando jquery para generar una solicitud a la API de búsqueda de Twitter. Estoy usando jsonp, ya que es necesario para solicitudes de dominios cruzados. Sin embargo, la API de Twitter especifica que debe establecer un User-Agent único para estas solicitudes, y limita sus solicitudes si no lo hace. El problema es que no veo forma de configurar este encabezado a través de jquery.Modificar encabezados HTTP para una solicitud JSONP

Este es el código que estoy utilizando:

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

He intentado usar el método beforeSend, pero parece que este evento no está disparando. ¿Alguien puede encontrar alguna forma de resolver este problema?

Gracias.

Respuesta

52

JSON con obras de relleno mediante la adición de un elemento de secuencia de comandos para la página, con el src atributo apuntando a la URL del servicio web. Luego, el servicio web devuelve un script que contiene los datos envueltos en una función de devolución de llamada que se ejecuta cuando el script termina el análisis. No es tanto JSON (ni siquiera tiene que ser JSON válido, para empezar), ya que es JavaScript simple.

Desafortunadamente, no hay forma de modificar los encabezados enviados para un elemento de script que se agrega a su página. La única cosa que puede hacer es comprobar si hay un método compatible con origen cruz de recuperación de datos, tales como:

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

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

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

sería una buena idea pruebe estas implementaciones si existen y utilícelas en consecuencia, volviendo al JSONP estándar para navegadores no compatibles o más antiguos.

También es posible (aunque poco probable, dado que es de alto perfil) que el servicio web no esté configurado para permitir solicitudes de origen cruzado, por lo que puede tener que recurrir a JSONP si falla la solicitud. Ver también, Cross-Origin Resource Sharing.

+1

1 buena respuesta detallada con información útil :) – Sarfraz

+1

Ah, es muy desafortunado. Creo que recurriré a un script envoltorio escrito en PHP que sale y obtiene los datos. De esa manera, puedo guardar en caché la búsqueda, así que tal vez sea una situación en la que todos ganan (aunque eso significa más trabajo). Gracias por la respuesta detallada. –

0

Prueba esto:

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

me encontré allí: https://groups.google.com/d/msg/google-api-javascript-client/GuFxPzqQ9-0/hZpo041UaH4J

Cuestiones relacionadas