2011-04-05 14 views
11

Intento ejecutar el siguiente código jquery en la red local.JSON: ¿Cómo hago una llamada JSON entre dominios?

$.ajax({ 
    type: "GET", 
    url: "http://SomeSite/MyUrl/", 
    cache: false, 
    data: { ... }, 
    dataType: "json", 

    error: function (xhr, status, error) { 
            ... 
    }, 
    success: function (json) { 
            ... 
    }); 

Todo funciona bien hasta que "SomeSite" es localhost. Me refiero al mismo servidor de lo que se descargó la página.

Pero cuando 'SomeSite' es otro sitio de red (no localhost), parece que la solicitud se cuelga. No se llaman funciones de devolución de llamada "error" ni "éxito". ¿Cómo puedo hacer que este código funcione?

¡Gracias de antemano!

+0

¿En qué navegador (s) lo probó? –

Respuesta

1

En realidad, solo puedes llamar a GET.
No hay una forma segura de llamar a POST, PUT, DELETE o PATCH, a través de scripts de sitios cruzados.
La única forma viable es un proxy escrito a mano.

1

Debido a la misma política de origen no puede hacer esto. Una solución consiste en utilizar el complemento Flash AJAX jQuery http://flxhr.flensed.com/ que utiliza una película Flash para eludir la política del mismo origen.

Las otras opciones son enviar por proxy las solicitudes a través de su propio dominio o usar JSONP.

16

Tuve el mismo problema. Intentando obtener json de un servidor al que no tuve acceso (=> no JSONP).

Encontré http://benalman.com/projects/php-simple-proxy/ Agregue el proxy php a su servidor y haga la llamada ajax a este archivo.
"Cualquier parámetro GET que se pase a través del recurso URL remoto debe estar urlencoded en este parámetro."

$.ajax({ 
    type: 'GET', 
    url:'proxy.php?url=http://anyDomain.com?someid=thispage', 
    dataType: "json", 
    success: function(data){ 
     // success_fn(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // error_fn(jqXHR, textStatus, errorThrown); 
    } 
}); 

donde proxy.php (el archivo de Ben Alman) está alojado en el dominio de



Alternativa (que he encontrado para ser el segundo mejor a este):
http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

+0

La alternativa funcionó como un encanto. ¡Gracias! Pero proxy php siempre fallaba, había avisos de PHP sobre parámetros opcionales indefinidos y la variable de contenido de json siempre era nula. – user2718671

7

¿Tiene acceso al servidor para 'SomeSite' o es tercero?

  • Si tiene acceso puede activar CORSwp, home en él. En su forma más simple (datos no es sensible a la sesión), sólo tiene que añadir la cabecera: Access-Control-Allow-Origin: *

  • Si no tiene acceso sabes si es compatible con JSONPwp, so? Esto generalmente implica pasar al menos un parámetro callback en la URL. (Por supuesto, si tiene acceso, también puede agregar el soporte JSONP.)

  • Si usted no tiene acceso a realizar cambios en 'somesite' y que no admite ni CORS ni JSONP, es posible que pueda utilizar YQLwp, home como un proxy. Es compatible con CORS y JSONP e incluso puede traducir formatos de datos, seleccionar una parte de los datos, etc.
    (Tenga en cuenta que YQL respeta robots.txt por lo que si se trata de un sitio de terceros que restringe el acceso automático, puede que no tenga suerte.)

+0

¿Qué se supone que hacen estos enlaces en hmoe y wp que cada conjunto va a un sitio web diferente? – AaA

+0

"wp" = la página de Wikipedia para la cosa. "hogar" es la página principal de la cosa. – hippietrail

+0

su segundo enlace a la casa es un video de youtube con letras Supongo – AaA

1

Si tiene acceso al servidor que desea cargar los recursos/datos de que puede modificar las cabeceras de petición de la respuesta de los servidores para incluir

"Access-control-Allow-origen", "*"

El mismo origen en la Política impuesta por los navegadores, hasta donde yo sé, en diversos grados de rigor dependiendo del navegador, ¿está (parcialmente?) basada en los valores de los encabezados de respuesta.

Tuve el mismo problema al intentar cargar json desde un servicio web. Todos los hacks de JS que encontré para eludir realmente no funcionaban y me preguntaba por qué incluso tengo que hacer esto, si quiero cargar datos de un servidor que yo mismo controlo (y confío). Luego aprendí que los encabezados de respuesta del servidor juegan un papel vital en todo este asunto. Cuando agregué el encabezado mencionado anteriormente a la respuesta http de mi servicio web, el problema fue resuelto.

+0

Por cierto, puede iniciar Chrome con el indicador --disable-web-security para hacer que caiga SameOriginPolicy. De esta forma, también puedes verificar los encabezados que formaban parte de tu respuesta usando la pestaña de red de Chrome. Esto me ayudó mucho cuando estaba depurando – bennidi

1

Tuve un problema similar. Intenté el script proxy citado por Symba, pero por alguna razón no podría funcionar en mi máquina. En mi caso, estaba intentando enviar una solicitud a una aplicación alojada en un JBoss AS en el mismo host. De alguna manera, la versión de JBoss I no tenía forma de modificar encabezados de respuesta para poder incluir "Access-Control-Allow-Origin", "*".

Lo resolví utilizando el enfoque de Symba anterior, pero en lugar de la secuencia de comandos de Ben Alman acabo de configurar un proxy inverso en mi servidor Apache, vea http://docs.oseems.com/general/application/apache/configure-reverse-proxy. Por defecto, Apache aún tendría problemas de dominio cruzado. Al configurar el encabezado de respuesta "Access-Control-Allow-Origin", "*", consulte http://enable-cors.org/server_apache.html, el problema desaparece.

Cuestiones relacionadas