2009-10-16 12 views
5

Estoy tratando de hacer una solicitud POST de dominio cruzado y de haber topado con una pared (o dos).Solicitud POST de subdominio cruzado síncrono con jQuery

No puedo poner una página de proxy en el servidor, por lo que no es una opción.

He investigado getJSON, que funciona muy bien, excepto que necesito POST no OBTENER.

¿Es posible hacer esto? Si es no, ¿alguien me puede explicar cómo funciona JSON y por qué no puedo hacer una alternativa POST?

Respuesta

26

Usted CANNOT hacer un pedido de varios dominios (GET/POST/etc) con un XMLHttpRequest (también conocido como AJAX).

Lo que puede hacer, cuando el servidor lo admite, es realizar una solicitud JSONP. Una solicitud JSONP funciona de la siguiente manera:

  • jQuery crea una función de acceso global de la función de devolución de llamada que usted proporciona como un argumento
  • En lugar de utilizar XMLHttpRequest (AJAX) para hacer la petición HTTP, jQuery inserta de forma dinámica un guión etiqueta en el DOM
  • el SRC de la etiqueta script es el URL de la solicitud a la que está tratando de comunicarse
  • jQuery añade un parámetro de devolución de llamada a la cadena de consulta de este modo: example.com/someurl.js?callback=someDynamicallyGeneratedMethodName
  • Está entonces arriba al servidor de JavaScript que su cliente puede utilizar al pasar el resultado JSON como un argumento a someDynamicallyGeneratedMethodName

Si usted no tiene control del servidor que envías para volver, entonces usted está fuera de suerte, JSONP ganó Te haces mucho bien. Cualquier cosa que devuelva el servidor estará en una etiqueta SCRIPT, y probablemente lanzará un error si no está formateada correctamente.

Para obtener más información al respecto, le sugiero que consulte la función base $ .ajax en lugar de los accesos directos. (En la documentación de jQuery bajo Ajax. Lo siento, no puedo publicar más enlaces)

Nuevamente, si no tiene control del servidor al que está publicando, es posible que desee consultar un proxy si es posible. De lo contrario, un IFRAME puede ser su única otra opción. También hay un método para lograr esto con un objeto SWF (flash). No lo he intentado, pero son soluciones a las limitaciones del objeto XMLHttpRequest.

Espero que pueda ayudar!

+0

+1. ¡Excelente publicación y bienvenido a SO! – aolde

+0

Gracias por la explicación. Es mucho más claro después de eso que una hora de Google. Tengo acceso al servidor en el que estoy publicando, así que todo está bien. –

+2

Err, ¿cómo se relaciona este comentario con el tema? ¡No cubre el POST que el AT específicamente está pidiendo! – HRJ

2

Puede hacer una publicación, pero lo que desea es una solicitud JSONP para solucionar los problemas de dominio cruzado. Básicamente, usted proporciona una función de devolución de llamada y la solicitud vuelve como contenido de script y se llama a su devolución de llamada con los datos JSON de la solicitud. La secuencia de comandos del lado del servidor deberá devolver los datos como una llamada de función utilizando la función de devolución de llamada envuelta alrededor del objeto JSON.

Consulte la documentación sobre la función post.

$.post('/example.com/controller/action?callback=?', 
     { param: "data" }, 
     function(data) { 
      ...do something with the data... 
     }, 'jsonp'); 

acción ASP.NET MVC para esto:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Action(string param, string callback) 
{ 
    var jsonData = ...do something and construct some data in JSON... 

    return Content(callback + "(" + jsonData + ");"); 
} 
+1

Para referencia futura: parece que a Google Chrome 6.0.472.63 no le gusta demasiado esto. En Safari procesa el JSON devuelto, pero Chrome solo muestra que "Access null no está permitido por Access-Control-Allow-Origin". mensaje. – Cimm

0

Si desea realizar Cross Domain POST, la solución más fácil es la proporcionada here por Matteo. Funcionó muy bien para mí

Cuestiones relacionadas