2011-08-18 18 views
42

Estoy tratando de hacer una llamada ajax desde jquery a un servicio de descanso. El servicio de descanso utilizado es el correcto desde un tutorial del blog de mkyong, este: http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/jQuery ajax llame al servicio REST

El servicio funciona, pero cuando intento hacer una llamada desde jQuery, en Firebug hay un código de estado 200, pero en la sección de respuesta , nada.

Aquí está la página HTML con la llamada ajax:

<html> 
<head> 
    <script type="text/javascript" src="jquery-1.6.2.min.js"></script> 
</head> 

<body> 

<button id="ajax">ajax call</button> 
<button id="json">json</button> 

<script type="text/javascript"> 
    $('#json').click(function(){ 
     alert('json'); 
     $.getJSON("http://localhost:8080/restws/json/product/get", 
     function(data) { 
      alert(data);   
      }); 
    }); 

    $('#ajax').click(function(){ 
     alert('ajax'); 
     $.ajax({ 
      type: "GET", 
      dataType: "json", 
      url: "http://localhost:8080/restws/json/product/get", 
      success: function(data){   
       alert(data); 
      } 
     }); 
    }); 

</script> 



</body> 

</html> 

no puedo averiguarlo que hice mal, ¿podría por favor dime lo que estoy haciendo mal?

Gracias!

+1

Es su sitio en ejecución en 'http: // localhost: 8080' así? Si no es así ('http: // localhost /' es [* no * el mismo] (http://en.wikipedia.org/wiki/Same_origin_policy)), tendrá que hacer que su salida API [JSONP] (http://en.wikipedia.org/wiki/JSONP). –

+0

no, es solo un html simple, se ejecuta con doble clic: D – DaJackal

+0

Quiero decir, ¿cuál es la URL que apunta a esta página? –

Respuesta

76

Está ejecutando su HTML desde un host diferente al host que está solicitando. Debido a esto, está siendo bloqueado por el same origin policy.

Una forma de evitar esto es usar JSONP. Esto permite solicitudes entre sitios.

En JSON, que se devuelven:

{a: 5, b: 6} 

En JSONP, el JSON está envuelto en una llamada a la función, por lo que se convierte en un guión, y no un objeto.

callback({a: 5, b: 6}) 

necesita editar su servicio REST para aceptar un parámetro llamado callback, y después de utilizar el valor de ese parámetro como el nombre de la función. También debe cambiar el content-type al application/javascript.

Por ejemplo: http://localhost:8080/restws/json/product/get?callback=process es la Salida:

process({a: 5, b: 6}) 

En JavaScript, que se necesitan para decirle jQuery para usar JSONP. Para hacer esto, debe agregar ?callback=? a la URL.

$.getJSON("http://localhost:8080/restws/json/product/get?callback=?", 
    function(data) { 
    alert(data);   
    }); 

Si utiliza $.ajax, que se auto anexar el ?callback=? si le dice a utilizar jsonp.

$.ajax({ 
    type: "GET", 
    dataType: "jsonp", 
    url: "http://localhost:8080/restws/json/product/get", 
    success: function(data){   
    alert(data); 
    } 
}); 
+1

funciona perfectamente ahora, y creo que lo entendí. gracias – DaJackal

+0

De nada. JSONP es una especie de 'truco' para obtener datos de otras URL, es genial. –

+0

recibo una respuesta ahora en firebug, pero no entra en la función (datos). ¿Sabes por qué? – DaJackal

1

Del uso de 8080 Supongo que está utilizando un contenedor servlet tomcat para servir su api de descanso. Si este es el caso, también puede considerar tener su proxy web las solicitudes al contenedor de servlets.

Con apache normalmente usaría mod_jk (aunque hay otras alternativas) para servir a la API a través del servidor web detrás del puerto 80 en lugar de 8080, lo que resolvería el problema del dominio cruzado.

Esta es una práctica común, tiene el contenido "estático" en el servidor web y el contenido dinámico en el contenedor, pero ambos se publican desde detrás del mismo dominio.

La URL de la API resto sería http://localhost/restws/json/product/get

Aquí una descripción sobre cómo utilizar mod_jk para conectar Apache Tomcat: http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

-2

Creo que no hay necesidad de especificar

'http://localhost:8080`" 

en la parte de URI ... porque. si lo especifica, deberá cambiarlo manualmente para cada entorno.

Sólo

"/restws/json/product/get" also works 
+0

Tan irrelevante, ¿no? – OverCoder

Cuestiones relacionadas