2010-08-27 24 views
5

No puedo publicar correctamente utilizando la funcionalidad ajax de jquery.jQuery Ajax POST no satisfactorio

URL de la página en ejecución es http://localhost:9999, URL del destino (servicio web) es http://localhost:8080. No, los puertos no son lo mismo, son 9999 y 8080 respectivamente.

A continuación se muestra la solicitud y el código jquery ajax.

Solicitud:

OPTIONS /profile/set_member HTTP/1.1 
Host: localhost:8080 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Origin: http://localhost:9999 
Access-Control-Request-Method: POST 

jQuery código Ajax:

$.ajax({ 
     type: "POST", url: "http://localhost:8080/profile/set_member", 
     contentType: "application/json", data: member, 
     error: function(){ alert('Update failed!'); }, 
     processData: false, 
     success: function(){ alert('Update successful!'); } 
}); 
+0

¿Estás publicando desde el mismo dominio? – BrunoLM

+0

¿Cuál es la URL de la página en ejecución? –

+0

¿Y desde el mismo puerto? –

Respuesta

6

Este es un problema con las llamadas ajax de dominios cruzados. Básicamente (al menos en Firefox), una solicitud POST se convierte en una solicitud de OPCIONES por razones de seguridad. Me encontré con la misma cosa exacta anoche, publicado aquí.

WCF Ajax Call not working with Jquery $.ajax

tuve una llamada $ .ajax yo estaba haciendo en localhost: 23485, a un servicio web en http://localhost alojado en IIS. Debido a que son dominios diferentes, el dominio cruzado intervino e hizo las cosas difíciles.

+0

Un síntoma más irritante es que la llamada $ .ajax a menudo informará el éxito cuando realiza este tipo particular de llamada, aunque en realidad no funcionó. – Dusda

+0

Además, al mirar el encabezado de su solicitud, veo que las direcciones de Origen y de Host son ambas localhost, pero de diferentes puertos. Exactamente lo mismo que me encontré anoche :(. – Dusda

+0

@Dusda: tiene razón, es el mismo problema. Aparentemente, la 'única' solución es tener un proxy entre la llamada ajax y el servicio web. – Mads610

0

Qué controlador se llama? ¿El controlador success o error? ¿Puedes explicar qué significa "no funciona"?

es probable que desee alert más información en el controlador error, así:

error: function(XMLHttpRequest, textStatus, errorThrown) { 
    //console.log is better at least for debugging. You can change this back to alert 
    //when your code goes into production 
    console.log("Update unsuccessful. Status: ", textStatus, " error thrown: ", errorThrown); 
} 

textStatus debería darle una idea de lo que podría ser el problema. Los valores posibles son "timeout", "error", "notmodified" y "parsererror". Una vez que descubra el error real, actualice la pregunta.

Además, si tiene Firebug, consulte la pestaña de red para ver la solicitud y la respuesta. Algunas fuentes comunes de errores:

  • Violando la política del mismo origen. No puede hacer un AJAX a una URL diferente de la página principal.
  • Errores del lado del servidor. Si su servidor devuelve algo así como un código de respuesta 500, la solicitud fallará.
  • Errores de análisis. Si está esperando un formato de respuesta específico como json o xml, y si la respuesta no está en ese formato, la solicitud de AJAX no tendrá éxito.
4

Realiza un proxy en el mismo dominio al que llamas ajax, p. en PHP:

<?php /* get.php */ 
    $url = $_GET["Url"]; 
    echo file_get_contents($url); 
?> 

Haga su ajax llamada:

$.ajax({ url: "get.php?Url=realurl.com" }); 

Esa es una solución temporal.