2011-08-27 14 views
12

que estoy tratando de conseguir un tipo de moneda con el Google Currency Calculator utilizando la siguiente jQuery (ficticio) código:Origen 'url' no está permitido por Access-Control-Allow-Origen

$.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 puede carga http://www.google.com/ig/calculator?hl=en&q=1DOP=?USD. Origin 'hostURL' no está permitido por Access-Control-Allow-Origin.

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

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

+0

posible duplicado de (http://stackoverflow.com/questions/1051748/cross-domain-scripting-error) – Joe

Respuesta

17

Las solicitudes de Ajax están limitadas por el Same Origin Policy del navegador. 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 con google.com directamente.

Existen soluciones para esta limitación que implica la inserción de etiquetas de secuencia de comandos (los archivos JS cargados mediante etiquetas de secuencia de comandos no están sujetos a la misma política de origen) y luego utilizan devoluciones de llamada JSONP para comunicar los resultados de los datos etiquetas de script Eso es probablemente lo que debe hacer aquí si la API que está intentando usar lo admite.

jQuery te ayudará mucho aquí ya que puede convertir automáticamente una llamada ajax en una llamada JSONP que se carga mediante etiquetas de script y puede funcionar en situaciones de dominio cruzado. De acuerdo con el jQuery doc for it's ajax function, lo hará automáticamente si ve "callback =" en la cadena de parámetros para la llamada ajax o si establece la opción crossDomain.

+10

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

+1

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

+0

Ya había intentado usar '& callback =?' Pero eso da como resultado 'resource interpretado como script pero transferido con mime type text html' Supongo que la respuesta tiene un tipo MIME de text/html en lugar de text/javascript pero No puedo arreglar eso ya que no tengo control sobre la respuesta ... ¿o sí? – PedroC88

2

Editar
pensé que estaba claro cuál era el problema, pero parece que podría no ser así que aquí va. Este error que está viendo es que el servidor restringe el acceso de su dominio a sus recursos a través de solicitudes ajax. Esto es standard JavaScript security - su secuencia de comandos solo puede hablar con el dominio de donde proviene. Como su JavaScript no se cargó desde los dominios de Google, no está en la lista de dominios permitidos para acceder a la API de la calculadora mediante ajax y es por eso que ve este mensaje de error.

Las opciones para realizar solicitudes de dominio cruzado con jQuery son outlined here. Como mencioné anteriormente, JSONP solo será una opción válida si el servidor lo admite porque debe enviar de vuelta el formato JSON apropiadamente formateado.


Podría serle útil si proporcionó enlaces a las páginas a las que se refiere.

Por lo que parece, esta API no admite JSONP (a menos que haya un parámetro no documentado) que es prácticamente la única opción para solicitudes ajax entre dominios, en este caso ya que no controla el servidor y no puede cambiar el access control headers.

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 the PHP script here.

+0

enlace a las páginas [error de guión de dominio Cruz?]? ¿El que tiene la respuesta JSON? Eso es '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

+0

@ PedroC88 ¿Hay documentación sobre la API? Usted dice que ha encontrado varios temas sobre el tema; ¿dónde? –

+0

Varios temas sobre el error del navegador, no sobre la API, en realidad, 'sobre esa API no he encontrado escuadrón. – PedroC88

2

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

crossdomain (por defecto: false para solicitudes del mismo dominio, verdaderos para solicitudes entre dominios) Tipo: booleano Si desea forzar una solicitud crossdomain (como JSONP) en el mismo dominio, establezca el valor de crossdomain a verdad Esto permite, por ejemplo, redireccionar el 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é luego de encontrarme 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){} 
}); 
+1

Eso no es para lo que es la propiedad. Si lee lo que dice en la documentación de jQuery, 'Si desea forzar una solicitud de CrossDomain (como JSONP) en el mismo dominio, establezca el valor de crossDomain en verdadero.' indica que hará que las mismas solicitudes de dominio parezcan de dominio cruzado. – Ian

1

punto adicional Minor de info.

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 con la llamada ajax.

Exmaple:

//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/", 
Cuestiones relacionadas