Question

Je suis en train d'écrire une application javascript qui charge les données de l'API OpenStreetMap ( http: //wiki.openstreetmap.org/wiki/OSM_Protocol_Version_0.6 ), qui est fondamentalement juste un api xml reposant. Je suis en train d'utiliser jquery pour accéder au format XML. mais je reçois des erreurs de sécurité. Ceci est un blocage de cross site scripting.

Comment puis-je accéder à ce XML? OSM ne AFAIK offre pas jsonp, ce qui ne fonctionne pas. Y at-il quand même?>

Était-ce utile?

La solution

Le blog lié par Dan vous montre comment résoudre ce problème, mais voici l'arrière-plan:

La seule façon que vous pouvez faire un appel Javascript inter-domaines à partir d'une page Web est par JSONP. Si vous n'êtes pas offert JSONP, vous devrez recourir à l'aide d'un script proxy, comme les navigateurs empêchent délibérément les scripts du site de faire de tels appels.

Notez que si vous écrivez une extension Firefox vous exécutez dans un espace privilégié, et sont donc en mesure de faire de tels appels inter-domaines sans restrictions.

Autres conseils

Les deux façons d'obtenir les scripts cross site tour est de mettre en place un proxy côté serveur pour appeler l'URL avec votre script appelant votre proxy côté serveur. L'autre façon est d'appeler les données en utilisant la balise de script qui ne dispose pas de restrictions sur les appels multisites.

API Nominatim de OpenStreetMap fait maintenant soutenir JSONP de sorte que vous pouvez obtenir des données purement avec le code côté client, rien besoin supplémentaire sur votre propre serveur. Voici un jsFiddle exemple - si vous pouvez le faire dans jsFiddle, vous pouvez faire nulle part.

Pour la question plus générale de savoir comment accéder aux API d'autres domaines, voici quelques choses utiles que j'ai appris en pataugeant à travers les nombreuses réponses partiellement complètes et souvent contradictoires là-bas, et par essais et erreurs. S'il vous plaît modifier ou commenter si quelque chose est ou devient inexact.

  • Si vous ne pouvez pas utiliser une API qui prend en charge JSONP, vous devez regarder dans les plugins comme jquery-xdomain-ajax utilisant des choses comme YQL et comprendre comment ils travaillent. En général, ces plugins semblent avoir pour objet de lecture HTML plus API interrogation.
  • Pour pouvoir accéder à une API directement, il doit a) offrir des résultats en JSON et b) ont un support intégré JSONP qui signifie: -
    • L'API doit être configuré pour écouter pour un paramètre dont il indique le nom de la fonction pour envelopper son résultat dans
    • Vous devez savoir ce que ce paramètre est appelé. Dans le cas de l'OSM, il est appelé json_callback, la callback par défaut de jQuery ne fonctionnera que si par hasard est ce que l'API est programmé pour écouter
    • Avec jQuery, il est cette clé de paramètre spécifique API qui devrait aller à la fin de l'URL de votre requête avec ? (par exemple si elle est json_callback, puis someurl.com/api?json_callback=?). jQuery chiffres sur ce que cela est, permute la ? pour une chaîne comme jQuery1712164863864387412, les noms de la fonction en ligne avec la même chaîne, et attend de recevoir un code qui déclenche cette fonction par son nom et il passe le JSON.
      • Si les travaux de demande, mais le rappel ne se déclenche et vous voyez pas une erreur comme parseerror jQuery17109935275333671539_1300495251986 was not called, cela signifie que jQuery a la fonction nommée, prêt et en attente, mais l'API n'a pas utilisé cette chaîne pour envelopper le JSON de sorte que la fonction n'est pas appelé - ce qui signifie probablement que vous n'êtes pas en utilisant le nom de paramètre de droite
    • Sans jQuery, vous devez passer cette clé de paramètre le nom d'une fonction nommée qui recevra le JSON
  • Depuis essentiellement tout ce qui se passe est le navigateur se charge alors d'une manière contrôlée l'exécution d'un extrait de code JavaScript traitement équivalent à someFunction({"some": "argument"});, le code d'erreur est limité (mais voir le jsFiddle pour ce jQuery offre si vous utilisez la syntaxe complète de $.ajax au lieu de le raccourci $.getJSON dépouillé vers le bas)
  • Dans Firebug pour moi demandes au moins JSONP ne figurent pas dans la console comme d'autres appels AJAX, plutôt, ils sont au bas du panneau NET (puisque, sous le capot, il est essentiellement un tour du dos mode de code de chargement, traité plus comme dire <script>).

Espérons que cela vous aidera quelqu'un!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top