jQuery ajax调用REST服务

时间:2011-08-18 19:00:17

标签: jquery rest

我正在尝试从jquery到休息服务进行ajax调用。使用的其他服务正好来自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>

我无法弄明白我哪里出错了,你能告诉我我做错了吗?

谢谢!

3 个答案:

答案 0 :(得分:78)

您正在从与请求的主机不同的主机运行HTML。因此,您被same origin policy阻止了。

解决此问题的一种方法是使用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=?附加到网址。

$.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);
   }
});

答案 1 :(得分:1)

从使用8080开始,我假设你使用的是一个tomcat servlet容器来为你的api服务。如果是这种情况,您还可以考虑让您的Web服务器代理对servlet容器的请求。

使用apache,您通常会使用mod_jk(尽管还有其他选择)通过端口80后面的Web服务器来代替8080,这将解决跨域问题。

这是常见做法,在网络服务器中包含“静态”内容,在容器中包含动态内容,但这两者都来自同一个域后面。

其余api的网址为http://localhost/restws/json/product/get

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

答案 2 :(得分:-2)

我认为没有必要指定

'http://localhost:8080`" 

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

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