jQuery ajax调用REST服务

我正在尝试从jquery ajax调用一个rest服务。 其余的服务使用的是从mkyong的博客教程,这是一个: http ://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

该服务的工作原理,但是当我尝试从jQuery进行调用,在Firebug中有200状态代码,但在响应部分,什么也没有。

这是带有ajax调用的html页面:

<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> 

我无法弄清楚我出错的地方,你能告诉我我做错了什么吗?

谢谢!

您正在从不同于您请求的主机的其他主机运行您的HTML。 正因为如此,您被相同的原产地政策阻止。

解决这个问题的一个方法是使用JSONP 。 这允许跨站点请求。

在JSON中,您将返回:

 {a: 5, b: 6} 

在JSONP中,JSON被封装在一个函数调用中,所以它成为一个脚本,而不是一个对象。

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

您需要编辑您的REST服务以接受一个名为callback的参数,然后使用该参数的值作为函数名称。 您还应该将content-type更改为application/javascript

例如: http://localhost:8080/restws/json/product/get?callback=process应该输出:

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

在你的JavaScript中,你需要告诉jQuery使用JSONP。 要做到这一点,你需要追加?callback=? 到url。

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

如果你使用$.ajax ,它会自动附加?callback=? 如果你告诉它使用jsonp

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

从8080的使用,我假设你正在使用一个Tomcat的servlet容器来服务你的restapi。 如果是这种情况,你也可以考虑让你的web服务器代理请求到servlet容器。

使用apache,你通常会使用mod_jk(尽pipe还有其他的select)来通过端口80后面的web服务器而不是8080来解决跨域问题。

这是常见的做法,在Web服务器中有“静态”内容,在容器中有dynamic内容,但都是从同一个域后面服务的。

剩下的api的url是http://localhost/restws/json/product/get

这里有关于如何使用mod_jk将apache连接到tomcat的描述: http : //tomcat.apache.org/connectors-doc/webserver_howto/apache.html

我觉得没有必要指定

 'http://localhost:8080`" 

在URI部分..因为。 如果您指定它,则必须为每个环境手动更改它。

只要

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