English 中文(简体)
火狐浏览器中的跨站点 XmlHttpRequest?
原标题:
  • 时间:2008-12-25 13:09:17
  •  标签:

我理解(大概)XmlHttpRequest对象遵循“同源策略”。但是,我想创建一个简单的(POC)本地HTML文件,从Web服务器下载XML并对其进行操作(从一个简单的“alert()”开始)。

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

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

我的简单尝试是从Mozilla的“使用XMLHttpRequest”页面中获取的代码。 它从“send”方法返回了一个我不太理解的错误。

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

最佳回答

XMLHttpRequest实际上遵循了同域政策的更严格的实现:尽管你可以设置document.domain属性来允许从两个子域中提供的JavaScript相互通信,但是你不能用XMLHttpRequestObject来做到这一点。在你的情况下,去一个完全不同的域,你也无法用JavaScript来做到这一点。

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

另一个选择是将数据作为JSON对象返回:<script src="foo"> 可以从任何地方检索它想要的数据。缺点是它不容易重复(如从同一页进行多个请求)。

我也建议你在 Google 上搜索“Google Mashups”。大部分这些应用都存在于“googlemashups.com”域名下,这样实现就容易许多。还有一些应用不在这个域名下,可能会给你一些灵感。

编辑:与直接使用XMLHttpRequest对象相比,我建议通过第三方库(如prototype.js)进行操作。

问题回答

如果您尝试检索的XML是由谷歌的JS API之一返回的,则无需XmlHttpRequest(因为这只能在与您的页面相同的域上使用)。

因此,在使用Google API(例如地图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 :)

你可以使用JSONP来实现这个。 我在这里使用jQuery和PHP进行。 基本上,我使用PHP代理来包装JSON回复,以便jQuery可以处理它。 它在BSD下。

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

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

请查看https://developer.mozilla.org/En/HTTP_access_control获取详细信息。





相关问题
热门标签