Используя этот простой фрагмент кода:Fetch возвращает пустой ответ, но вкладка Сеть показывает данные
fetch("https://www.youtube.com/feeds/videos.xml?channel_id=UCAL3JXZSzSm8AlZyD3nQdBA", { mode: "no-cors" })
.then(r => {
console.debug(r);
r.text().then(t => console.debug(t)).catch(console.error);
})
.catch(console.error);
я получаю пустой ответ (null
тела, пустой url
, status
нуля, ok
является false
), однако, когда я иду вкладку «Сеть», я могу видеть данные на вкладке «Ответ» внутри нее. Я ожидаю ответа fetch
, чтобы дать мне то же самое.
Что дает? Я попытался добавить credentials: "include"
, но это не повлияло и не должно, этот ресурс должен быть доступен без него.
Это потому, что вы не хотите, чтобы вы получали такие ресурсы, они не отправляют заголовки CORS, поэтому вы не можете напрямую получить ресурс в браузере - если вы удалите '{mode: 'no-cors'}' вы увидите ошибку CORS - прочитайте, какой режим no-cors ** на самом деле ** означает [здесь] (https://developer.mozilla.org/en- US/docs/Web/API/Request/mode) –
Почему сетевой запрос проходит? Это RSS-канал, не должен ли я просто «ПОЛУЧИТЬ» его? –
запрос проходит, потому что это заголовки ответов, которые контролируют CORS, поэтому вам нужно получить ответ, чтобы узнать, разрешен ли CORS для сайта. Вы можете увидеть тело ответа в консоли, потому что нет проблем с безопасностью, когда вы видите тело ответа в консоли, так как вы можете просто открыть страницу в любом случае, правильно. Тот факт, что это RSS-канал, не имеет значения - youtube явно не хочет, чтобы браузеры просматривали другие сайты, чтобы напрямую обращаться к своим ресурсам RSS. Вам необходимо «проксировать» запрос на ** ваш ** сервер –