【发布时间】:2017-03-23 20:17:46
【问题描述】:
使用这个简单的 sn-p:
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",但它没有任何区别,也不应该,没有它应该可以访问此资源。
【问题讨论】:
-
这是因为 youtube 不希望您获取这样的资源,他们不发送 CORS 标头,因此您无法将资源直接放入浏览器 - 如果您删除
{mode: 'no-cors'}you'将看到 CORS 错误 - 阅读什么模式 no-cors 实际上 意味着 here -
为什么网络请求会通过呢?这是一个 RSS 提要,我不应该只是
GET吗? -
请求通过,因为它是控制 CORS 的响应标头 - 因此您必须获得响应才能知道该站点是否启用了 CORS。您可以在控制台中看到响应正文,因为在控制台中看到响应正文没有安全问题,因为您无论如何都可以打开页面,对。它是一个 RSS 提要这一事实是无关紧要的 - youtube 显然不希望正在查看其他站点的浏览器直接访问他们的 RSS 资源。您需要在您的服务器上“代理”请求
-
啊哈。好的。你能回答评论让我接受吗?
-
没必要,我觉得在 SO 上已经讲过很多次了
标签: javascript fetch-api