Javascript 获取xml跨域调用不一致

Javascript 获取xml跨域调用不一致,javascript,jquery,xml,ajax,Javascript,Jquery,Xml,Ajax,我整个上午都在围绕这个主题阅读,但我仍然对结果感到困惑 据我所知,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/ser

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

据我所知,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中查看时,我可以看到提要实际上是下载的。我觉得奇怪的是,如果这是一个跨域调用,为什么会出现这种情况,它肯定会在提取提要之前停止

下面的代码拉进饲料


$.ajax({
键入:“获取”,
网址:rssurl,
数据类型:“xml”,
成功:函数(数据、文本状态、jqXHR){
document.write(“获取提要:+textStatus+”
”; var$xml=$(数据); $xml.find(“item”).each(函数(){ 变量$this=$(this), document.write($this.find(“title”).text()); }); }, 错误:函数(jqXHR、textStatus、errorshown){ 警报(“故障”); console.log('status:'+textStatus); 如果(textStatus=='error') console.log(错误抛出); } );

关于我的问题:

  • 为什么我可以对一个提要而不是另一个提要进行跨域调用;这两个提要不都应该被禁止吗
  • 如果第二个提要确实包含错误,为什么它会在本地工作
  • 啊,啊,啊,啊
  • cheers

    指定浏览器请求服务器授权将内容嵌入来自另一个来源的框架中。所有现代浏览器都遵守此规范

    当你问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
    
    因此,您可以看到,您被授权嵌入内容(在这里,我向小提琴手询问,因此服务器可能只回答“*”,意思是所有来源,而不必对标题的这一部分进行个性化设置)

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

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

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

    当你问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
    
    因此,您可以看到,您被授权嵌入内容(在这里,我向小提琴手询问,因此服务器可能只回答“*”,意思是所有来源,而不必对标题的这一部分进行个性化设置)

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


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

    回答您的问题:

  • 服务器的策略决定是否允许跨域调用。从另一个角度来看,开发人员非常熟悉跨域策略。要访问另一个域上的web服务,服务需要授权跨域请求。目的是试图限制跨站点脚本恐怖袭击
  • 这意味着feed没有问题,只是当您远程加载它时,浏览器会根据跨域策略阻止您的请求
  • 嘈杂声

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

    回答您的问题:

  • 服务器的策略决定是否允许跨域调用。从另一个角度来看,开发人员非常熟悉跨域策略。要访问另一个域上的web服务,服务需要授权跨域请求。目的是试图限制跨站点脚本恐怖袭击
  • 这意味着feed没有问题,只是当您远程加载它时,浏览器会根据跨域策略阻止您的请求
  • 嘈杂声

  • 您提出了一个有趣的观点,一些浏览器确实加载了文件(Fiddler证实了这一点).IE完全不加载文件。我不知道答案,但听一下关于这一点的解释会很有趣。

    您是否检查了网络控制台以查看是否在HTTP响应中设置了标头?您是否检查了网络控制台以查看是否在HTTP响应中设置了标头?