2016-11-09 42 views
1

使用这个简单的代码片段:取返回空响应,但Network标签显示的数据

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,零statusokfalse),但是当我去网络标签,我可以看到其中的响应标签中的数据。我预计fetch回应给我一样的。

什么给?我试过添加credentials: "include",但它没有区别,不应该,这个资源应该可以访问没有它。

+2

这是因为youtube不希望你像这样获取资源,他们不会发送CORS头,所以你不能直接获取资源到浏览器 - 如果你删除'{mode:'no-cors'}'你会看到CORS错误 - 读取什么模式no-cors **其实**意味着[here](https://developer.mozilla.org/en- US/docs/Web/API/Request/mode) –

+0

为什么网络请求会通过?这是一个RSS提要,我不应该只能'GET'它吗? –

+1

请求经过,因为它是控制CORS的响应标头 - 所以您必须获得响应才能知道是否为该站点启用了CORS。您可以在控制台中看到响应主体,因为在控制台中查看响应主体时没有任何安全问题,因为无论如何您都可以打开页面。它是一个RSS源的事实是无关紧要的 - youtube显然不希望浏览器正在查看其他站点直接访问其RSS资源。您需要在**您的**服务器 –

回答

1

我会answerize,因为它帮助我:)

请求经历,因为它的响应头控制CORS - 所以你必须得到回应知道CORS为网站启用。

您可以在控制台中看到响应正文,因为在控制台中查看响应正文时没有任何安全问题,因为您可以随意打开页面。

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