javascript - 获取 - 响应预检响应

标签 javascript cors fetch-api preflight

我正在努力通过授权获取 CORS:

const token = 'this.is.secret!';
fetch('http://corsserver/api/hello', {
    method: 'get',
    credentials: 'include',
    mode: 'cors',
    headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/x-www-form-urlencoded'
    }
}).then(response => {
  console.log(response);
}).catch(error => {
  console.log(error);
});

当我运行这个请求时,Chrome 将 header 设置为:

请求方法:OPTIONS

我查了一下,it's a preflighted request .

我的意思是,这真的很酷。但是我不知道如何在预检返回后发送实际请求!下一步是什么?如何发送 GET 请求?

我在这里遗漏了一些非常基本的东西。

最佳答案

如果 OPTIONS 请求成功,浏览器将自动发送实际的 GET 请求。但是,如果 OPTIONS 请求不成功,浏览器将永远不会发出 GET 请求。

如果浏览器不执行 OPTIONS 请求,就无法发出 GET 请求。

因此,如果浏览器没有执行 GET,则只能表示 OPTIONS 一定失败了,您需要找出原因。浏览器应该在其 devtools 控制台中记录一条消息,其中包含原因,因此您应该首先检查那里(然后编辑/更新问题以添加该信息,或者发布一个新的单独的更具体的问题和错误消息) .


猜测可能是什么问题:也许服务器要求对 OPTIONS 请求进行身份验证。如果是这样,您需要修复它以使服务器不这样做——因为当浏览器发出 OPTIONS 请求时,它不会发送 Authorization header +值你的代码。

事实上,在这种情况下,OPTIONS 请求的全部目的是让浏览器询问,您是否可以获取具有 Authorization< 的跨域请求 请求 header ?,并让服务器以指示它是否允许 Authorization header 的方式进行响应。

因此,服务器必须配置为使用 2xx 成功响应来响应任何 OPTIONS 请求(至少来自允许的源),而不需要身份验证。

如果您的浏览器正在记录的 CORS 消息显示 OPTIONS 响应的 401 状态,您就会知道服务器是否需要对该 OPTIONS 请求进行身份验证。


在 Node.js 服务器环境中处理 OPTIONS 的示例代码:

if (req.method === 'OPTIONS') {
  res.send();
  return;
}

…让服务器发送一个没有响应主体的 200 响应,这正是您想要的。请注意,这明确允许所有 OPTION 请求。

关于javascript - 获取 - 响应预检响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45395174/

相关文章:

javascript - 在 Sharepoint 2013 中启用 CORS

php - angularjs和PHP:在飞行前响应中,Access-Control-Allow-Headers不允许请求 header 字段Access-Control-Allow-Origin

php - 从下拉列表中选择 -> 比较 -> 如果匹配 -> 显示图片

javascript - 无法获取字符串数组

angularjs - 响应的 HTTP 状态代码为 400 + 请求的资源上不存在 'Access-Control-Allow-Origin' header 。 - 平均堆栈

javascript - react "Unhandled Rejection (TypeError): this.state.features.map is not a function"

javascript - JS Fetch API 访问返回值

javascript - 使用新的 fetch API 时如何缓存 Promise?

javascript - vscode : rearrange code for js/ts files

javascript - 我的 html 中的符号未正确加载