web-dev-qa-db-fra.com

Modifier les en-têtes HTTP pour une demande JSONP

J'utilise jQuery pour créer une demande à l'API de recherche Twitter. J'utilise jsonp, comme cela est nécessaire pour les requêtes entre domaines. Cependant, l'API Twitter spécifie que vous devez définir un agent utilisateur unique pour ces demandes et limite vos demandes si vous ne le faites pas. Le problème est que je ne vois aucun moyen de définir cet en-tête via jquery.

C'est le code que j'utilise:

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

J'ai essayé d'utiliser la méthode beforeSend, mais il semble que cet événement ne se déclenche pas. Quelqu'un peut-il trouver un moyen de résoudre ce problème?

Merci.

25
Dan D.

JSON avec Padding fonctionne en ajoutant un élément de script à la page, l'attribut src pointant vers l'URL du service Web. Le service Web renvoie ensuite un script contenant les données encapsulées dans une fonction de rappel exécutée à la fin de l'analyse. Ce n'est pas tellement JSON (pour commencer, il n'est même pas nécessaire que ce soit un JSON valide), il s'agit de Plain JavaScript.

Il est malheureusement impossible de modifier les en-têtes envoyés pour un élément de script ajouté à votre page. La seule chose que vous puissiez faire est de rechercher une méthode de récupération de données compatible avec plusieurs origines, telle que:

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

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

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

Ce serait une bonne idée de tester ces implémentations si elles existent et de les utiliser en conséquence, en revenant à JSONP standard pour les navigateurs non pris en charge ou plus anciens. 

Il est également possible (mais peu probable, étant donné son profil élevé) que le service Web ne soit pas configuré pour autoriser les requêtes inter-origines. Vous devrez donc peut-être toujours recourir à JSONP si la demande échoue. Voir aussi, Partage de ressources d'origine croisée .

55
Andy E

Essaye ça :

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

Je l'ai trouvé ici: https://groups.google.com/d/msg/google-api-javascript-client/GuFxPzqQ9-0/hZpo041UaH4J

0
Azr