2014-07-09 189 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