2014-07-09 185 views
2

我想從其他網站檢索json數據,所以我試圖做一個簡單的跨域請求。我在Wamp上運行了這個index.php文件:跨域請求被阻止

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" manifest="manifest.appcache"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>MySite</title> 
<script type="text/javascript"> 
    function getXDomainRequest() { 
     var xdr = null; 

     if (window.XDomainRequest) { 
      xdr = new XDomainRequest(); 
     } else if (window.XMLHttpRequest) { 
      xdr = new XMLHttpRequest({mozSystem: true}); 
     } else { 
      alert("Your browser does not support AJAX"); 
     } 

     return xdr; 
    } 
    function sendData() { 
     var xdr = getXDomainRequest(); 
     xdr.onload = function() { 
      alert(xdr.responseText); 
     } 

     xdr.open("GET", "http://example.com"); 
     xdr.send(); 
    } 
</script> 
</head> 
<body> 
<p> 
     <input type="button" onclick="sendData();" value="Retrieve" /> 
</p> 
</body> 
</html> 

但是,我收到一個錯誤消息,說明跨源請求已被阻止。我對js很新,這是我第一次嘗試在js中使用web API,所以我可能完全錯過了這裏的東西......

非常感謝。

+2

'XMLHttpRequest'不適用於跨域請求。請參閱[JSONP](http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about)。 –

+0

好的,但XDomainRequest是否正確? 我在查詢不支持JSONP的[Steam API](https://developer.valvesoftware.com/wiki/Steam_Web_API#GetGlobalAchievementPercentagesForApp_.28v0001.29)。 – deKajoo

+4

請勿使用瀏覽器提出此請求,否則您的api密鑰將免費提供給任何人(無論誰?)使用您的應用程序。 –

回答

5

Javascript請求只能在某些情況下跨域。以下是一些技巧和解決方法的總結。

  1. 如果源具有JSONP可用,則可以規避跨域限制。 http://www.sitepoint.com/jsonp-examples/

  2. 不太可能,但是如果源具有源策略,則可以執行跨域請求。看到您收到錯誤時,我懷疑消息來源是否有此政策。如果我記得,這是不支持所有瀏覽器...

  3. 如果我記得,有一些iFrame方法(我會稱他們爲黑客)傳輸數據。充其量不是最佳。

  4. 如果一切都失敗了,您可以使用PHP緩存JSON文件並將其存儲在您的服務器上。它不再是跨域。

更多細節可以在Ways to circumvent the same-origin policy

如果你正試圖從一個公共API拉,比它很可能是他們有JSONP可被發現。如果他們不這樣做,很可能他們不希望你每次都提取數據(他們不希望佔用帶寬費用),而是希望你在必要時使用PHP緩存它。

+0

謝謝,我正在尋找,我有點害怕php,但由於JSONP將無法正常工作,我需要隱藏我的API密鑰我想這是沒有辦法... – deKajoo

+0

@JonathanLonowski足夠公平。我的措辭可能不是最好的;更新以反映評論。 – Jason

+0

任何好的教程或方法4的來源? – deKajoo