使用获取 API 读取响应标头

2022-08-30 05:05:55

我使用的是 Google Chrome 扩展程序,具有 权限,并且我正在尝试从 XMLHttpRequest 切换到 Fetch API"*://*/*"

该扩展存储用户输入的登录数据,这些数据以前直接放入 XHR 对 HTTP 身份验证的 open() 调用中,但在 Fetch 下不能再直接用作参数。对于 HTTP 基本身份验证,规避此限制是微不足道的,因为您可以手动设置授权标头:

fetch(url, {
  headers: new Headers({ 'Authorization': 'Basic ' + btoa(login + ':' + pass) })
  } });

然而,HTTP Digest Auth需要更多的交互性;您需要读取服务器通过其 401 响应发送给您的参数,以创建有效的授权令牌。我尝试使用以下代码段读取响应标头字段:WWW-Authenticate

fetch(url).then(function(resp) {
  resp.headers.forEach(function(val, key) { console.log(key + ' -> ' + val); });
}

但我得到的只是这个输出:

content-type -> text/html; charset=iso-8859-1

这本身是正确的,但根据Chrome的开发人员工具,它仍然缺少大约6个字段。如果我使用(或任何其他字段),我只得到.resp.headers.get("WWW-Authenticate")null

有没有机会使用Fetch API访问这些其他字段?


答案 1

在通过 CORS 使用提取 API 时,访问响应标头存在限制。由于此限制,您只能访问以下标准标头:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

当您为Google Chrome扩展程序编写代码时,您使用的是CORS,因此您无法访问所有标头。如果控制服务器,则可以在响应中返回自定义信息,而不是bodyheaders

有关此限制的更多信息 - https://developers.google.com/web/updates/2015/03/introduction-to-fetch#response_types


答案 2

如果不是 CORS:

提取在调试时或控制台.log响应时不显示标头

您必须使用以下方式访问标头。

response.headers.get('x-auth-token')