从不存在“Access-Control-Allow-Origin”标头的资源中获取状态代码

Posted

技术标签:

【中文标题】从不存在“Access-Control-Allow-Origin”标头的资源中获取状态代码【英文标题】:getting status code from resource with No 'Access-Control-Allow-Origin' header present 【发布时间】:2017-04-06 21:25:13 【问题描述】:

我正在使用良好的 'ol XMLHttpRequest 向 https://www.instagram.com/USERNAME 发出 GET 请求。我的目标是确认我的用户输入的 Instagram 用户名确实存在,如果我能在客户端确认这一点,那就太好了。

例如,尝试向https://www.instagram.com/9gag 发出 GET 请求,您会得到 200 的回复。 https://www.instagram.com/sakjafkhdsafd 你会得到一个 404 回复。

现在,现在……好像 Instagram 不允许 CORS……因为当我运行 XMLHttpRequest.send() 时,我收到以下错误:

XMLHttpRequest cannot load https://www.instagram.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.

好的,猜猜服务器将不得不处理这个......但是!如果我检查我的网络选项卡,我实际上会看到正在发出请求,并且我收到了带有预期状态代码的响应。我也得到了所有的 html,一切。什么...?

浏览器(在我的情况下是 chrome)如何能够捕获这个但不能捕获我的应用程序?

按要求添加我的代码:

var xhr = new XMLHttpRequest();

xhr.open("GET", "https://www.instagram.com/" + username, false);
xhr.onreadystatechange = function () 
        if (xhr.readyState == 4 && xhr.status == 200) 
           // do something...
        
    
xhr.send()

编辑:

我刚刚在 Firefox 上进行了测试,得到了 301。我想我现在的问题是“chrome 正在做什么来获取网络选项卡上的预期状态代码?”

【问题讨论】:

在这里测试。就我而言,一切都返回 301 http 状态码。你可以在这里发布你的 xmlHttpRequest 代码吗? @BrunoPeres - 添加到问题中。我只是一个简单的原始 xmlhttprequest,同步的,但我认为这不会改变任何事情 我刚刚在 chrome 的控制台中运行了该代码,将 username 替换为“9gag”,并在网络选项卡上返回了 200 确认 Instagram 用户名存在不足以验证状态码 == 200 到 onreadystatechange?我相信我没有很好地理解你的问题。你不能发布更多的细节吗?对不起。 @BrunoPeres 我实际上没有在我的应用程序中获得状态代码。每当我发出请求时,我只会在 chrome 的网络选项卡上看到状态代码,而且我无法理解如何从不允许 cors 的资源中获取浏览器中的状态代码。另一方面,我用 Firefox 对此进行了测试,得到了 301。 【参考方案1】:

虽然浏览器已成功检索到内容,但由于CORS,它禁止您阅读任何内容。

CORS 本身有点令人困惑 - 如果服务器可以正常完成请求,为什么浏览器会阻止它?不过好吧,这是一个以向后兼容的方式粘贴的安全限制。

更令人惊讶的是,即使对于错误也是如此:服务器必须在其响应中添加一个特殊的标头,甚至允许客户端读取状态代码或错误消息!

但浏览器会在浏览器控制台和网络选项卡中显示这些内容。

【讨论】:

以上是关于从不存在“Access-Control-Allow-Origin”标头的资源中获取状态代码的主要内容,如果未能解决你的问题,请参考以下文章

“从不”类型上不存在属性“地图”

JSON数组上的“从不”类型不存在属性

如何从不存在下载按钮的 pdfviewer 下载/保存为 pdf 演示文稿?

从不存在的源表到目标表的大量数据

Vetur 说,在模板上使用道具时,“从不”类型中不存在道具

“从不”类型上不存在属性“值”。在 mui 中使用 useRef 挂钩时