JQuery .get xml crossdomain调用不一致

时间:2012-06-01 18:17:09

标签: javascript jquery xml ajax

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

根据我的理解,JQuery .ajax .get不能使用datatype =“xml”跨浏览器工作,但是下面的RSS提要确实有效

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

然而,当我尝试拨打另一个Feed时,它无效。它给出了一个解析错误。

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

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

此外,在Fiddler中查看时,我可以看到Feed已下载。我觉得奇怪的是,如果这是一个跨域调用,为什么会这样呢?肯定会在提取源之前停止?

在提取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. 为什么我能够对一个Feed而不是另一个Feed进行跨域调用;不应该被禁止吗?
  2. 如果第二个Feed确实包含错误,为什么它会在本地工作?
  3. arghhhhhhhhhhhhhhh
  4. 欢呼声

2 个答案:

答案 0 :(得分: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,但服务器可能只回答'*'意味着所有起源而不打扰个性化这部分标题)。

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

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

答案 1 :(得分:0)

回答你的问题:

  1. 服务器的策略决定是否允许跨域调用。从另一个角度来看,FlashSilverlight开发人员非常熟悉跨域策略。要访问另一个域上的Web服务,该服务需要授权跨域请求。目的是尝试限制跨站点脚本攻击。
  2. 这意味着Feed没有任何问题,只是当您远程加载时,浏览器会阻止您的每个跨域策略请求。
  3. LOUD NOISES
  4. 您提出了一个有趣的观点,即某些浏览器确实会加载该文件(由Fiddler确认)。相比之下,IE根本不加载文件。我不知道答案,但听到对这一点的解释会很有趣。