fetch()发送小写标题键

fetch() sends lower case header keys

本文关键字:标题 fetch      更新时间:2023-09-26

我正在编写一个用于AtomElectron的HTTP API库。它基于fetch。服务器超出了我的控制范围,但它是用PHP编写的,我可以看到它以区分大小写的方式检查标头。

我的代码类似于:

const headers = new Headers();
headers.append('Authorization', `Bearer ${key}`);
const init = {
    method: 'GET',
    headers: headers 
} 
const req = new Request(baseUrl + '/items?format=json');
return fetch(req, init);

请求被拒绝,并出现403 FORBIDDEN错误。当我在Electron Newtork面板中查看请求时,请求标头已存在,但Authorization已变为authorization

我知道fetch()只是遵循HTTP标准,但有没有一种简单的方法可以让fetch()在我提供标头时发送它们?

当前获取将toLowercase()所有标头。(这里有一些讨论https://github.com/whatwg/fetch/issues/304关于可选禁用)。

现在您可能需要使用http://api.jquery.com/jquery.ajax/使用header选项。

Firefox v110,Chromium v108:

使用构造函数创建标头new Headers()降低了这种情况,但提供请求头作为普通对象发送正确的大写Athorization: Bearer

所以不是

fetch('api/end-point', {
  headers: new Headers(...)
})

我这样做:

fetch('api/end-point', {
  headers: {
    ...{other headers},
    Authorization: `Bearer ${token}`,
  }
})

未在其他环境中测试

使用fetch我自己并做类似的事情,我们做如下。。。

const GLOBALS = require('./Globals');
const HEADERS = {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
};
const resourceURL = '/some/endpoint'
const body = '';
var request = new Request(`${GLOBALS.API_ENDPOINT}${resourceURL}`, {
                        method: 'GET',
                        headers: new Headers(Object.assign(HEADERS, {'Authorization': `JWT ${token}`})),
                        body: body ? JSON.stringify(body) : null
                    }); 
return fetch(request)
    .then(res => consume)

Take是伪伪代码,因为我们传入了一些函数参数,这些参数在模板文本中进行了计算。