Question

J'essaie donc de faire une demande à l'API d'échange de pile avec le code jQuery suivant:

$.ajax({                                                                                                                                                                                                        
    type: 'POST',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); }                                                                                                                                                              
});   

Mais lorsque j'ouvre le fichier sur ma machine, dans Firefox ou Chrome, et que je fais la demande, j'obtiens cette erreur:

Resource interpreted as Script but transferred with MIME type application/json.
Uncaught SyntaxError: Unexpected token :
Uh Oh!

Je n'ai aucune idée de ce qui se passe. Je connais l'API Exchange Stack GZIPS ses réponses, cela causerait-il des problèmes?

Était-ce utile?

La solution

Vous devez définir un paramètre non conventionnel pour faire fonctionner l'API SO. Plutôt que le conventionnel callback, vous devez passer un jsonp paramètre.

De plus, vous ne pouvez pas faire POST avec JSONP.

$.ajax({                                                                                                                                                                                                        
    type: 'GET',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); },
    jsonp: 'jsonp'                                                                                                                                                
});

Il n'est pas possible de faire un Ajax inter-domaine en utilisant le XMLHTTPRequest conventionnel. Ceci est pour des raisons de sécurité (il s'agit de la politique d'origine homosexuelle).

Il y a une solution de contournement. script Les balises ne sont pas soumises à cette restriction. Cela signifie que vous pouvez insérer un script Taguez dans le document qui appelle une URL. Si vous définissez une fonction accessible à l'échelle mondiale dans votre script et dites au serveur distant comment cette fonction est appelée, le serveur peut passer du code qui enveloppe les données à envoyer dans un appel à cette fonction.

La difficulté que vous avez eu ici est avec l'API Stackoverflow. Conventionnellement, vous utiliseriez le callback Argument dans votre demande, pour indiquer au serveur comment votre fonction est appelée. Cependant, l'API de Stackoverflow vous demande d'utiliser le jsonp paramètre à la place.

Autres conseils

Essayez cette URL: http://api.stackoverflow.com/1.1/stats?jsonp=Callme

"CallMe" est le nom de votre fonction de rappel - dans votre espace de noms global (objet Window).

Soit dit en passant, si vous exécutez Firefox et que le module complémentaire JSONView Installé, vous pouvez tester directement l'URL ci-dessus (et la vôtre pour comparaison).

Résulte de l'appel de l'URL:

callme({
  "statistics": [
...
  ]
})
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top