La URL de origen no está permitida por Access-Control-Allow-Origin

Estoy tratando de obtener una tasa de cambio con el Google Currency Calculator usando el siguiente código jquery (ficticio):

    $.getJSON("http://www.google.com/ig/calculator?hl=en&q=1" + "DOP" + "=?" + "USD",
        function(data) {
            $('.currNumber').each(function (index) {
                $(this).html(parseFloat($(this).html()) * 0.02681);
                                  });
          });

XMLHttpRequest no se puede cargar http://www.google.com/ig/calculator?hl=en&q=1DOP=?USD. El origen 'hostURL' no está permitido por Access-Control-Allow-Origin.

Al buscar en el sitio, encontré varios temas sobre el tema, pero en su mayoría se refieren al acceso a archivos locales e intentan resolverlo iniciando Chrome con un parámetro adicional (también estoy usando Chrome), pero ese no es mi problema, que en realidad parece más relacionado con las restricciones entre dominios.

Entonces, la pregunta es: ¿Cómo puedo usar jQuery para obtener la tasa de esa URL?

preguntado el 27 de agosto de 11 a las 17:08

4 Respuestas

Las solicitudes de Ajax están limitadas por el navegador Política del mismo origen. En pocas palabras, eso significa que no puede hablar directamente con un servidor a través de ajax que no esté en el mismo dominio que la página en la que se ejecuta su secuencia de comandos. Por lo tanto, a menos que esté desarrollando una página para google.com, no puedo hablar directamente con google.com.

Existen soluciones para esta limitación que implican la inserción de etiquetas de script (los archivos JS cargados a través de etiquetas de script no están sujetos a la misma política de origen) y luego el uso de devoluciones de llamada JSONP para comunicar los resultados de los datos a su script principal desde esas etiquetas de script. Eso es probablemente lo que debe hacer aquí si la API que está intentando utilizar lo admite.

jQuery lo ayudará mucho aquí, ya que puede convertir automáticamente una llamada ajax en una llamada JSONP que se carga a través de etiquetas de script y puede funcionar en situaciones de dominio cruzado. De acuerdo con la jQuery doc para su función ajax, lo hará automáticamente si ve "callback =" en la cadena de parámetros para la llamada ajax o si configura la opción crossDomain.

Respondido 27 ago 11, 22:08

No soy un desarrollador web calificado ... ¿Cómo se puede lograr esto? - PedroC88

Lea mis ediciones recientes que lo describen con más detalle. jQuery puede hacer la mayor parte del trabajo por usted, pero tendrá que configurar la llamada ajax de manera apropiada. - jfriend00

Ya había intentado usar &callback=? pero eso resulta en resource interpreted as script but transferred with mime type text html Supongo que eso significa que la respuesta tiene un tipo MIME de texto / html en lugar de texto / javascript, pero no puedo solucionarlo ya que no tengo control sobre la respuesta ... ¿puedo? - PedroC88

Por lo general, es una advertencia inofensiva. Si el recurso se transfirió como un script, entonces debería estar bien. ¿Apuntó callback = xxxx a una función de JavaScript propia? ¿Leíste sobre la compatibilidad con JSONP en esa API de Google y cómo funciona? Un poco de búsqueda en Google sobre JSONP probablemente lo ayudará a educarlo y luego a estudiar el documento jQuery ajax en lo que respecta a JSONP. - jfriend00

El soporte de jQuery para JSONP es solo una cara de la moneda: jQuery no puede funcionar, es mágico si el servidor / API no admite devoluciones de llamada. - no.good.at.coding

Editar
Pensé que estaba claro cuál era el problema, pero parece que no es así, aquí va. Este error que está viendo es el servidor que restringe el acceso de su dominio a sus recursos a través de solicitudes ajax. Este es seguridad JavaScript estándar - su secuencia de comandos solo puede comunicarse con el dominio desde el que se originó. Dado que su JavaScript no se cargó desde los dominios de Google, no está en la lista de dominios a los que se les permite acceder a la API de la calculadora a través de ajax y es por eso que ve este mensaje de error.

Las opciones para realizar solicitudes entre dominios con jQuery son esbozado aquí. Como mencioné anteriormente, JSONP solo será una opción válida si el servidor lo admite porque debe devolver JSON con el formato adecuado.


Podría ayudar si proporciona enlaces a las páginas a las que se refiere.

Sin embargo, por lo que parece, esta API no es compatible JSONP (a menos que haya un parámetro no documentado) que es prácticamente su única opción para solicitudes ajax de dominio cruzado en este caso, ya que no controla el servidor y no puede cambiar el encabezados de control de acceso.

Es posible que desee considerar la creación de un recurso del lado del servidor que accederá a esta API por usted sin estar limitado por el modelo de seguridad de JavaScript, como el script PHP aquí.

Respondido 27 ago 11, 23:08

¿Enlace a qué páginas? ¿El que tiene la respuesta JSON? Es decir http://www.google.com/ig/calculator?hl=en&q=1DOP=?USD También estoy desarrollando esto para webworks (por lo que no se ejecutará en ningún servidor, sino en un dispositivo móvil). PedroC88

@ PedroC88 ¿Existe documentación sobre la API? Dice que ha encontrado varios temas sobre el tema; ¿dónde? - no.good.at.coding

Varios temas sobre el error del navegador, no sobre la API, en realidad, sobre esa API que no he encontrado. - PedroC88

Ah, ya veo, pensé que querías decir que habías visto la documentación de la API. Bueno, parece que no hay evidencia de soporte para JSONP sin el cual no puede usar este servicio a través de ajax, desafortunadamente. Considere la posibilidad de escribir un proxy PHP simple. Si está alojando su propio servidor Apache, también puede usar un proxy / proxy inverso para redirigir de forma transparente las solicitudes fuera de su dominio. - no.good.at.coding

Parece de este enlace - http://api.jquery.com/jQuery.ajax/ - que fue proporcionado anteriormente por jfriend00 - explica un parámetro que puede incluir en la solicitud ajax de JQuery llamado "crossDomain" que es un booleano.

crossDomain (predeterminado: falso para solicitudes del mismo dominio, verdadero para solicitudes entre dominios) Tipo: Booleano Si desea forzar una solicitud crossDomain (como JSONP) en el mismo dominio, establezca el valor de crossDomain en verdadero. Esto permite, por ejemplo, la redirección del lado del servidor a otro dominio. (versión agregada: 1.5)

Por lo tanto, establecerlo en verdadero debería resolver (?) Esto. No soy un experto, pero lo intenté después de encontrarme continuamente con este problema y pareció resolver el problema.

Ejemplo:

$.ajax({ //my ajax request
        url: "_URL_I_AM_MAKING_REQUEST_TO_",
        type: "GET",
        cache: false,
        dataType: "json",
        **crossDomain: true,**
        data: { _mydata_
        success : function(response){}
});

respondido 07 mar '13, 03:03

Para eso no es la propiedad. Si lee lo que dice en la documentación de jQuery, dice 'Si desea forzar una solicitud de dominio cruzado (como JSONP) en el mismo dominio, establezca el valor de dominio cruzado en verdadero'. afirma que hará que las solicitudes del mismo dominio se vean como las de varios dominios. - Ian

Punto de información adicional menor.

Llegué a esta pregunta porque recibí este error al intentar publicar en mi propio servidor.

Solución: asegúrese de que el nombre de host coincida en la llamada ajax.

Ejemplo:

//This failed

$.post("http://domain.com/index.php/count/",

//This succeeded (the page this was called from was www.domain.com/.....)

$.post("http://www.domain.com/index.php/count/",

respondido 08 nov., 13:00

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.