Domanda

Sto cercando di scrivere un'applicazione javascript che carica i dati dal API OpenStreetMap ( http: //wiki.openstreetmap.org/wiki/OSM_Protocol_Version_0.6 ), che è fondamentalmente solo un API XML riposante. Sto cercando di utilizzare jQuery per accedere al XML. tuttavia ricevo errori di sicurezza. Si tratta di una croce di blocco site scripting.

Come posso accedere a tale XML? Per quanto ne so OSM non offrono jsonp, in modo che non funziona. C'è comunque?>

È stato utile?

Soluzione

Il post sul blog collegato da Dan mostra come risolvere questo problema, ma qui è lo sfondo:

L'unico modo è possibile effettuare una tra domini Javascript chiamata da una pagina web è tramite JSONP. Se non si è offerto JSONP, allora si dovrà ricorrere all'utilizzo di uno script proxy, come i browser volutamente impedire l'esecuzione del sito di effettuare tali chiamate.

Si noti che se si sta scrivendo un'estensione per Firefox che si sta eseguendo in uno spazio privilegiato, e quindi sono in grado di effettuare tali chiamate cross-domain, senza restrizioni.

Altri suggerimenti

I due modi per ottenere il turno cross site scripting è quello di impostare un proxy lato server per chiamare l'url con lo script chiamando il proxy lato server. L'altro modo è quello di chiamare i dati utilizzando il tag script che non ha limitazioni sulle chiamate cross site.

nominatim API di OpenStreetMap ora supporta JSONP modo da poter ottenere i dati puramente con il codice lato client, che necessitano di nulla in più sul proprio server. Ecco un jsfiddle esempio - se si può farlo in jsfiddle, si può fare ovunque.

Per la questione più generale di come accedere alle API da altri domini, ecco alcune cose utili che ho imparato mentre guadare attraverso le molte risposte contraddittorie parzialmente complete e spesso là fuori, e attraverso tentativi ed errori. Si prega di modificare o commentare se qualcosa è o diventa imprecisa.

  • Se non è possibile utilizzare un'API che supporta JSONP, è necessario esaminare plugin come jquery-ajax-xdomain utilizzando le cose come YQL e capire come lavorano. In genere, questi plugin sembrano orientati per la lettura HTML più di query API.
  • Per poter accedere direttamente un'API esso deve a) offerta risultati in JSON e b) hanno un supporto incorporato JSONP che significa: -
    • L'API deve essere configurato per ascoltare fuori per un parametro che indica il nome della funzione di avvolgere il suo risultato in
    • Devi scoprire che cosa quel parametro si chiama. Nel caso di OSM, si chiama json_callback, callback default di jQuery funziona solo se per caso questo è ciò che l'API è programmato per ascoltare
    • Con jQuery, è questo tasto specifico parametro-API che dovrebbe andare alla fine del tuo URL query con ? (ad esempio se si tratta di json_callback, quindi someurl.com/api?json_callback=?). jQuery capisce che cosa si tratta, scambia il ? per una stringa come jQuery1712164863864387412, nomi delle funzioni in linea con la stessa stringa, e attende di ricevere un codice che attiva quella funzione per nome e lo passa il JSON.
      • Se le opere di richiesta ma il callback non si attiva e si vede un errore come parseerror jQuery17109935275333671539_1300495251986 was not called, significa jQuery ha la funzione denominata, pronto e in attesa, ma l'API non ha usato quella stringa per avvolgere il JSON così la funzione non si chiama - probabilmente significa che non si sta usando il nome del parametro destra
    • Senza di jQuery, è necessario passare la chiave del parametro il nome di una funzione denominata che riceverà il JSON
  • Poiché in sostanza tutto ciò che sta accadendo è il browser sta caricando quindi in modo controllato l'esecuzione di un frammento di codice javascript equivalente a someFunction({"some": "argument"});, la gestione degli errori è limitato (ma vedere la jsfiddle per ciò che jQuery offre se si utilizza la sintassi completa $.ajax invece di la ridotta scorciatoia $.getJSON)
  • In Firebug per me almeno richieste JSONP non appaiono nella console come gli altri chiamate AJAX, invece, sono in fondo al pannello NET (in quanto, sotto il cofano, è essenzialmente un round-the-back modo di codice di carico, gestito più come dire <script>).

Speriamo che questo vi aiuterà qualcuno!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top