使用带有模式的 fetch API:'no-cors',无法设置请求标头

Posted

技术标签:

【中文标题】使用带有模式的 fetch API:\'no-cors\',无法设置请求标头【英文标题】:Using fetch API with mode: 'no-cors', can’t set request headers使用带有模式的 fetch API:'no-cors',无法设置请求标头 【发布时间】:2017-11-20 05:37:32 【问题描述】:

我正在尝试访问服务端点并且该服务是登录服务 我将身份验证类型用作基本类型,代码在响应中并使用 fetch 库,但是即使我在请求中设置了 headers 字段,我也无法在网络选项卡中的请求中看到相应标头的值?

以下是代码:

var obj = 
  method: 'GET' ,
  mode : 'no-cors',
  headers: 
      'Access-Control-Request-Headers': 'Authorization',
      'Authorization': 'Basic amFzcGVyYWRtaW46amFzcGVyYWRtaW4=',
      'Content-Type': 'application/json',
      'Origin': ''
  ,
  credentials: 'include'
;
fetch('http://myreport:8082/jasperserver/rest/login/', obj ).then(…

弹出窗口询问我用户名和密码


从网络标签请求和响应呼叫

【问题讨论】:

这似乎是一个跨域请求,为什么您将模式设置为 'no-cors'? 【参考方案1】:

您的标头都不是CORS-safelisted,因此它们不能附加到请求中。

解释:

    no-cors 请求模式将标头对象的 guard 属性设置为 request-no-cors

    要将 name/value(名称/值)对附加到 Headers 对象(标头),浏览器必须运行以下步骤:

      Normalize 值。

      如果 name 不是 name 或 value 不是 value,则抛出 TypeError。

      如果守卫是“不可变的”,则抛出 TypeError。

      否则,如果guard是“request”并且name是一个禁止的头名称,则返回。

      否则,如果守卫是"request-no-cors" 并且名称/值不是CORS-safelisted request-header,则返回。 ←你的场景

      否则,如果guard是“response”并且name是一个禁止的响应头名称,则返回。

      将名称/值附加到标题列表。

    CORS-safelisted request-header(不区分大小写): Accept Accept-Language Content-Language Content-Type,但前提是该值是以下之一: application/x-www-form-urlencoded multipart/form-data text/plain

您可以在此处了解有关 fetch 的 Headers class 规范的更多信息: https://fetch.spec.whatwg.org/#headers-class

【讨论】:

mode: 'no-cors' 基本上将请求标准化为“简单”请求,例如,服务器将收到 Content-Type: text/plain 而不是您在代码 sn-p 中的 application/json。我觉得这种行为很奇怪/很有趣,但就是这样。 mode:no-cors 也避免触发预检。

以上是关于使用带有模式的 fetch API:'no-cors',无法设置请求标头的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 fetch 和 pass in 模式:no-cors

响应状态 = 0 使用 fetch polyfill 模式:'no-cors'

Fetch API 默认跨域行为

fetch.js是啥

如何在 fetch() 中使用 no-cors

JavaScript fetch API和Python Flask头问题