【问题标题】:Fetch returns empty response but Network tab shows dataFetch 返回空响应,但 Network 选项卡显示数据
【发布时间】: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 正文,空 urlstatus 为零,okfalse),但是当我转到网络选项卡时,我可以在其中的响应选项卡。我希望 fetch 回复给我同样的结果。

什么给了?我尝试添加credentials: "include",但它没有任何区别,也不应该,没有它应该可以访问此资源。

【问题讨论】:

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

标签: javascript fetch-api


【解决方案1】:

我会回答,因为它帮助了我:)

请求通过是因为它是控制 CORS 的响应标头 - 因此您必须获得响应才能知道该站点是否启用了 CORS。

您可以在控制台中看到响应正文,因为在控制台中看到响应正文没有安全问题,因为您无论如何都可以打开页面,对。

它是一个 RSS 提要的事实是无关紧要的 - youtube 显然不 希望正在查看其他网站的浏览器直接访问他们的 RSS 资源。您需要在服务器上“代理”请求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2021-07-20
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多