JQuery .get xml несоответствия между доменными вызовами

Я читаю вокруг этого предмета все утро, но я все еще смущен результатами.

Насколько я понимаю, JQuery .ajax .get не должен работать в разных браузерах, используя datatype="xml", однако работает следующий rs feed

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({ 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. Если 2-й канал содержит ошибки, почему он будет работать локально?
  3. arghhhhhhhhhhhhhhh

ура

2 ответа

Решение

Норма CORS указывает, что браузер запрашивает у сервера разрешение на встраивание контента в фрейм, происходящий из другого источника. Все современные браузеры соблюдают эту норму.

Когда вы спрашиваете 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. Это политика сервера, которая решает, разрешен ли междоменный вызов или нет. Чтобы взглянуть на это с другой точки зрения, разработчики Flash и Silverlight хорошо знакомы с междоменными политиками. Чтобы получить доступ к веб-службе в другом домене, службе необходимо авторизовать междоменные запросы. Цель - попытка ограничить атаки межсайтовых скриптов.
  2. Это означает, что в канале нет ничего плохого, просто когда вы загружаете его удаленно, браузер блокирует ваш запрос в соответствии с междоменной политикой.
  3. ГРОМКИЕ ЗВУКИ

Вы затронули интересный момент: некоторые браузеры действительно загружают файл (как подтвердил Fiddler). IE напротив не загружает файл вообще. Я не знаю ответа, но было бы интересно услышать объяснение этого момента.

Другие вопросы по тегам