Erreur de retour de la demande JSONP: "Syntaxerror non appris: jeton inattendu:"
-
15-11-2019 - |
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?
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": [
...
]
})