Pregunta

Estoy tratando de escribir una aplicación JavaScript que carga los datos de la API de OpenStreetMap ( http: //wiki.openstreetmap.org/wiki/OSM_Protocol_Version_0.6 ), que es básicamente una API XML reparador. Estoy tratando de utilizar jQuery para acceder al XML. Sin embargo, recibo errores de seguridad. Se trata de un bloqueo de cross site scripting.

¿Cómo puedo acceder a esa XML? Que yo sepa OSM no ofrecen jsonp, por lo que no funciona. ¿Hay alguna forma?>

¿Fue útil?

Solución

La entrada de blog ligado por Dan muestra cómo resolver este problema, pero aquí está el fondo:

La única manera en que puede hacer una entre dominios Javascript llamada de una página web es a través de JSONP. Si no se le ofrece JSONP, entonces tendrá que recurrir al uso de un script de proxy, como navegadores propósito evitar que las secuencias de comandos del sitio de hacer este tipo de llamadas.

Tenga en cuenta que si usted está escribiendo una extensión de Firefox se está ejecutando en un espacio privilegiado, y por lo tanto son capaces de hacer este tipo de llamadas entre dominios sin restricciones.

Otros consejos

Los dos maneras de conseguir alrededor de este tipo de ataque es configurar un proxy del lado del servidor para llamar a la dirección URL con la secuencia de comandos llamando su proxy del lado del servidor. La otra forma es llamar a los datos utilizando la etiqueta script que no tiene restricciones en las llamadas entre sitios.

API de OpenStreetMap Nominatim ahora es compatible con JSONP para que pueda obtener datos puramente con el código del lado del cliente, no necesita nada extra en su propio servidor. Aquí hay un jsFiddle ejemplo - si puede hacerlo en jsFiddle, puede hacerlo en cualquier lugar.

En la cuestión más general de cómo acceder a la API de otros dominios, aquí hay algunas cosas útiles que he aprendido mientras camina a través de las muchas respuestas contradictorias parcialmente completos y, a menudo por ahí, ya través de ensayo y error. Por favor, editar o comentar si algo es o se vuelve inexacta.

  • Si no puede utilizar una API que soporta JSONP, usted tiene que mirar en plugins como jquery-xdomain-ajax usando cosas como YQL y entender cómo trabajan. En general, estos complementos parecen estar orientados para la lectura de HTML más de consulta de las API.
  • Para poder tener acceso a una API directamente debe a) ofrecen resultados en JSON y b) se han construido en el soporte JSONP que significa: -
    • La API debe estar configurado para escuchar a cabo para un parámetro que indica que el nombre de la función para envolver su resultado en
    • Debe averiguar lo que se llama parámetro. En el caso de la OSM, se llama json_callback, callback predeterminado de jQuery sólo funcionará si por casualidad que es lo que la API está programado para escuchar
    • Con jQuery, es este parámetro clave-API específica que debe ir al final de la URL de su consulta con ? (por ejemplo si se trata de json_callback, entonces someurl.com/api?json_callback=?). jQuery se da cuenta de lo que es esto, intercambia los ? para una cadena como jQuery1712164863864387412, nombres de la función en línea con la misma cadena, y espera recibir un código que desencadena esa función por su nombre y le pasa el JSON.
      • Si las obras petición, pero la devolución de llamada no se dispara y se ve un error como parseerror jQuery17109935275333671539_1300495251986 was not called, significa jQuery tiene la función llamada, listo y esperando, pero la API no ha utilizado esa cadena para envolver el JSON lo que la función no se llama - es probable que significa que no está utilizando el nombre del parámetro derecha
    • Sin jQuery, que necesita para aprobar esa llave parámetro el nombre de una función llamada que recibirá el JSON
  • Desde esencialmente todo lo que está sucediendo es que el navegador está cargando a continuación de manera controlada la ejecución de un fragmento de código javascript equivalente a someFunction({"some": "argument"});, manejo de errores es limitada (pero ver la jsFiddle por lo jQuery ofertas Si se utiliza la sintaxis $.ajax completa en lugar de el simplificada de acceso directo $.getJSON)
  • En Firebug para mí al menos solicitudes JSONP no aparecen en la consola al igual que otras llamadas AJAX, más bien, que están en la parte inferior del panel de red (ya que, bajo el capó, que es esencialmente una ronda de la espalda modo de código de carga, maneja más como decir <script>).

Esperamos que esto ayude a alguien!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top