2011-08-18 124 views
42

我試圖做一個從jquery到休息服務的ajax調用。其餘服務使用的是從mkyong的博客教程,這一個:http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/jQuery ajax調用REST服務

該服務的工作原理,但是當我嘗試從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> 

我無法弄清楚哪裏出了問題,你能告訴我什麼,我做錯了什麼?

謝謝!

+1

是您的網站上'HTTP運行://本地主機:8080'呢?如果不是('http:// localhost /'是[* not * the same](http://en.wikipedia.org/wiki/Same_origin_policy)),那麼您必須使您的API輸出[JSONP]( http://en.wikipedia.org/wiki/JSONP)。 –

+0

不,這只是一個簡單的html,它是雙擊運行的:D – DaJackal

+0

我的意思是,指向此頁面的URL是什麼? –

回答

76

您正在從不同於您請求的主機的主機運行您的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=?到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); 
    } 
}); 
+1

現在工作很完美,我想我明白了。謝謝 – DaJackal

+0

不客氣。 JSONP是從其他URL獲取數據的'黑客',它非常酷。 –

+0

我現在在螢火蟲中得到迴應,但它沒有輸入函數(數據)。你知道爲什麼嗎? – DaJackal

1

從使用8080我假設你正在使用tomcat servlet容器來爲你的其餘api服務。如果是這種情況,您還可以考慮讓您的web服務器代理將請求發送到servlet容器。

對於apache,你通常會使用mod_jk(儘管還有其他的選擇)通過端口80後面的web服務器而不是8080服務於api,這將解決跨域問題。

這是常見的做法,在web服務器和容器中的動態內容中具有「靜態」內容,但都是從同一個域後面提供的。

爲REST API的URL是http://localhost/restws/json/product/get

這裏就介紹如何使用mod_jk的說明連接阿帕奇到Tomcat: http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

-2

我覺得沒有必要指定

'http://localhost:8080`" 

在URI部分..因爲。如果您指定它,則必須爲每個環境手動更改它。

只有

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

如此無關緊要,不是嗎? – OverCoder