代码之家  ›  专栏  ›  技术社区  ›  noamtm

Firefox中的跨站点XmlHttpRequest?

  •  3
  • noamtm  · 技术社区  · 17 年前

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

    我试图从中下载的服务器是 在我的控制下(它实际上是一个谷歌API)。

    我的简单尝试是从 Mozilla's "Using XMLHttpRequest" page

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

    5 回复  |  直到 17 年前
        1
  •  3
  •   kdgregory    17 年前

    XMLHttpRequest实际上遵守了同一域策略的更严格的实现:虽然可以设置document.domain属性以允许来自两个子域的JavaScript相互通信,但不能使用XMLHttpRequestObject实现。在您的情况下,要进入一个完全不同的领域,您也不能使用JavaScript。

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

    另一种选择是以JSON对象的形式返回数据:<脚本src=“foo”>可以从任意位置检索所需的任何数据。这样做的缺点是它不(容易)重复(就像来自同一页面的多个请求一样)。

    编辑:与其直接使用XMLHttpRequest对象,我建议使用prototype.js之类的第三方库

        2
  •  1
  •   Bullines    17 年前

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

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

    <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:)

        3
  •  1
  •   Corv1nus    16 年前

    您可以使用JSONP来实现这一点。我做到了 here 使用jQuery和PHP。基本上,我使用PHP代理来包装JSON回复,以便jQuery能够处理它。它在BSD下。

        4
  •  0
  •   Andrew    16 年前

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

        5
  •  0
  •   Daniel    14 年前

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

    看见 https://developer.mozilla.org/En/HTTP_access_control 详情请参阅。

    推荐文章