2012-06-01 35 views
1

我一直在閱讀這個主題,但我仍然對結果感到困惑。JQuery .get xml crossdomain調用不一致

據我所知JQuery的阿賈克斯不用彷徨不應該使用的數據類型=「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. 如果第二個Feed確實包含錯誤,爲什麼它會在本地工作?
  3. arghhhhhhhhhhhhhhh

歡呼聲

+1

您是否檢查過網絡控制檯,看看在HTTP響應中是否設置了[Control-Access-Allow-Origin]標頭(https://developer.mozilla.org/en/http_access_control)? – apsillers

回答

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但服務器要求的內容(這裏可以簡單地回答'*',表示所有來源,而不打擾個性化標題的這部分)。

結論是合乎邏輯的:如果服務允許,可以包含跨域部分。

請記住,它主要是一個瀏覽器側鎖,它可以保護您作爲用戶(和您的數據)免受注入。

+0

現在很清楚(ish),謝謝 – user1431241

0

回答您的問題:

  1. 就這麼決定了跨域調用是否允許或不允許服務器的政策。從另一個角度來看,FlashSilverlight開發人員非常熟悉跨域策略。要訪問另一個域上的Web服務,該服務需要授權跨域請求。目的是試圖限制跨站腳本攻擊。
  2. 這意味着Feed沒有任何問題,只是當您將其遠程加載時,瀏覽器會根據跨域策略阻止您的請求。
  3. 大聲喧譁

你提出一個有趣的問題是有些瀏覽器實際加載的文件(小提琴手證實)。相比之下,IE根本不加載文件。我不知道答案,但聽到關於這一點的解釋會很有趣。