【问题标题】:JQuery .get xml crossdomain call inconsistenciesJQuery .get xml跨域调用不一致
【发布时间】:2012-06-01 18:17:09
【问题描述】:

我整个上午都在阅读这个主题,但我仍然对结果感到困惑。

据我了解,JQuery .ajax .get 不应该使用 datatype="xml" 跨浏览器工作,但是以下 rs 提要确实有效

var rssurl = 'http://gdata.youtube.com/feeds/base/videos/-/trees?orderby=published&alt=rss';

但是,当我尝试调用另一个提要时,它不起作用。它给出了一个解析错误。

var rssurl = 'http://api.flickr.com/services/feeds/photos_public.gne?tags=trees&format=rss2'

现在,当我在本地复制并调用它时,这个不工作的提要确实有效。这就是为什么我认为这是一个跨域问题。

另外,在 Fiddler 中查看时,我可以看到 Feed 已实际下载。我觉得奇怪的是,如果它是跨域调用,为什么会发生这种情况,肯定会在提取提要之前停止?

在拉取提要的代码下方。

$.ajax({ type: "GET", url: rssurl, dataType: "xml", success: function(data, textStatus, jqXHR) { document.write("got the feed: "+ textStatus+"
"); var $xml = $(data); $xml.find("item").each(function() { var $this = $(this), document.write( $this.find("title").text() ); }); }, error: function(jqXHR, textStatus, errorThrown){ alert('failure'); console.log('status: ' + textStatus); if (textStatus == 'error') console.log(errorThrown); } );

所以关于我的问题:

  1. 为什么我可以跨域调用一个提要而不是另一个提要?不应该都被禁止吗?
  2. 如果第二个提要确实包含错误,为什么它会在本地工作?
  3. 啊啊啊啊啊啊啊啊啊

干杯

【问题讨论】:

标签: javascript jquery xml ajax


【解决方案1】:

CORS norm 指定浏览器向服务器请求授权以将内容嵌入来自另一个来源的框架中。所有现代浏览器都尊重这一规范。

当你询问 api.flickr.com 时,它并没有给你授权。

但是当你询问 gdata.youtube.com 时,它会回答这个标题:

HTTP/1.1 200 OK
X-GData-User-Country: FR
Access-Control-Allow-Origin: http://fiddle.jshell.net
Content-Type: text/xml; charset=UTF-8
Expires: Fri, 01 Jun 2012 19:41:43 GMT
Date: Fri, 01 Jun 2012 19:41:43 GMT
Cache-Control: private, max-age=1800, no-transform
Vary: *
GData-Version: 1.0
Last-Modified: Fri, 01 Jun 2012 19:41:43 GMT
Content-Encoding: gzip
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE

所以你看到你被授权嵌入内容(这里我从小提琴中问,因此http://fiddle.jshell.net,但服务器可能会简单地回答'*'表示所有来源,而无需打扰个性化标题的这一部分)。

结论是合乎逻辑的:如果服务允许,您可以包含跨域部分。

请记住,它主要是一个浏览器侧锁,可以保护您作为用户(和您的数据)免受注入。

【讨论】:

    【解决方案2】:

    回答您的问题:

    1. 是否允许跨域调用取决于服务器的策略。从另一个角度来看,FlashSilverlight 的开发人员对跨域策略非常熟悉。要访问另一个域上的 Web 服务,该服务需要授权跨域请求。目的是试图限制跨站点脚本攻击。
    2. 这意味着提要没有任何问题,只是当您远程加载它时,浏览器会根据跨域策略阻止您的请求。
    3. 噪音很大

    您提出了一个有趣的观点,即某些浏览器确实会加载文件(由 Fiddler 确认)。相比之下,IE 根本不加载文件。我不知道答案,但听听对这一点的解释会很有趣。

    【讨论】:

      猜你喜欢
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2016-01-10
      • 2013-02-24
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多