Firefox中的跨站点XmlHttpRequest?

时间:2008-12-25 13:09:18

标签: javascript api firefox xmlhttprequest

我理解(我认为)XmlHttpRequest对象遵循“同域”策略。但是,我想创建一个简单的(POC)本地html文件,该文件从Web服务器下载XML并对其执行某些操作(让我们从简单的“alert()”开始)。

有可能吗?我需要一个特殊的Firefox配置选项吗?

我正在尝试下载的服务器在我的控制之下(它实际上是Google API)。

我的简单尝试是来自Mozilla's "Using XMLHttpRequest" page的代码。它返回一个我从“发送”方法中无法理解的错误。

免责声明:我主要是一名C / C ++开发人员 - 从未做过任何严肃的JS编程,从未尝试使用这些API。

5 个答案:

答案 0 :(得分:3)

XMLHttpRequest实际上遵循相同域策略的更严格的实现:虽然您可以设置document.domain属性以允许从两个子域提供的JavaScript相互通信,但您无法使用XMLHttpRequestObject执行此操作。在你的情况下,去一个完全不同的域,你也不能用JavaScript做到这一点。

有几种选择。首先,您可以使用反向代理使外部网站看起来是您网站的子域。看看Apache的mod_proxy,特别是ProxyPassReverse

另一种方法是将数据作为JSON对象返回:< script src =“foo”>可以从任何地方检索它想要的任何数据。这样做的缺点是它不是(容易)可重复的(如同一页面的多个请求)。

我还建议您使用谷歌“google mashups”。其中大多数都存在于“googlemashops.com”域中,这使得实施变得更加容易。有些人住在那个领域之外,可能会给你一些想法。

编辑:我建议不要直接使用XMLHttpRequest对象,而是通过第三方库,例如prototype.js

答案 1 :(得分:1)

如果您尝试检索的XML是由某个Google的JS API返回的,那么就不需要XmlHttpRequest(因为它只能在与您的页面相同的域中使用)。

因此,在使用Google API(例如地图版)的情况下,通常首先在页面的某个位置添加对其常用API的引用:

<script type="text/javascript" src="http://www.google.com/jsapi?key=your_google_api_key"></script>

然后添加对您计划用于页面的特定API的引用:

<script type="text/javascript">google.load("maps", "2");</script>

现在您可以调用该API提供的各种功能:

<script type="text/javascript">
  function initialize() {
    var map = new google.maps.Map2(document.getElementById("map"));
    map.setCenter(new google.maps.LatLng(41.86, 87.68), 13);
  }
  google.setOnLoadCallback(initialize);
</script>

不需要XmlHttpRequest:)

答案 2 :(得分:1)

您可以使用JSONP执行此操作。我使用jQuery和PHP做here。基本上我使用PHP代理来包装JSON回复,以便jQuery可以处理它。它属于BSD。

答案 3 :(得分:0)

或者尝试使用IE8。如果您从磁盘而不是网站运行,IE8将忽略所有正常的域限制并获取您想要的数据。

答案 4 :(得分:0)

使用jQuery(可能是XHR,但我尽量不直接使用它),您可以愉快地执行跨域请求,前提是您没有指定异常标头或非GET方法。如果您确实想要使用这些,则必须控制服务器才能启用OPTIONS请求。

有关详细信息,请参阅https://developer.mozilla.org/En/HTTP_access_control