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