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);
}
);
Итак, на мои вопросы:
- Почему я могу совершать междоменный звонок одному каналу, а не другому; не должны ли быть оба забанены?
- Если 2-й канал содержит ошибки, почему он будет работать локально?
- 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/ но серверы могут просто ответить "*", означая все источники, не заботясь о персонализации этой части заголовка),
Вывод логичен: вы можете включить междоменные части, если сервис позволяет это.
И имейте в виду, что это в основном блокировка на стороне браузера, которая защищает вас как пользователя (и ваши данные) от инъекций.
Чтобы ответить на ваши вопросы:
- Это политика сервера, которая решает, разрешен ли междоменный вызов или нет. Чтобы взглянуть на это с другой точки зрения, разработчики Flash и Silverlight хорошо знакомы с междоменными политиками. Чтобы получить доступ к веб-службе в другом домене, службе необходимо авторизовать междоменные запросы. Цель - попытка ограничить атаки межсайтовых скриптов.
- Это означает, что в канале нет ничего плохого, просто когда вы загружаете его удаленно, браузер блокирует ваш запрос в соответствии с междоменной политикой.
- ГРОМКИЕ ЗВУКИ
Вы затронули интересный момент: некоторые браузеры действительно загружают файл (как подтвердил Fiddler). IE напротив не загружает файл вообще. Я не знаю ответа, но было бы интересно услышать объяснение этого момента.