我正在开展一个我希望重用现有API的辅助项目。
API具有/auth
端点,用于处理POST请求,并期望请求正文中的email
和password
。如果验证了email
和password
,则服务器返回一个响应,其中包含Authorization
标头,该标头包含应在所有后续请求中发送的令牌值。
我在从响应中检索此标头时遇到问题。它在邮差和Chrome开发工具(网络部分)中都可见。
Chrome开发工具:
console.log
响应标头
我已经尝试了多个库/实现来发送请求(superagent
,request
,fetch
实现甚至是XMLHttpRequest
),但是,我得到的所有响应都有我在Chrome开发工具中查看响应标头中的Authorization
标头,但是当我尝试从javascript访问标头时,我总是只获得Content-Type
标头。
我在其他几个答案中读到服务器必须在标头中指定Access-Control-Expose-Headers
或Access-Control-Allow-Headers
并带有Authorization
值,但是,我无法访问服务器并且与此问题相关的API没有任何问题,所以我的猜测是我在发送请求时遗漏了一些内容。
有什么想法吗?
以下是使用fetch
return fetch(endpoint, {
method: 'post',
body: data,
headers: {
[API_KEY_HEADER]: apiKey
}
}).then(r => {
console.log(r);
console.log(r.headers)
});
以下是使用request
r({
url: endpoint,
method: 'post',
headers: {
[API_KEY_HEADER]: apiKey
}
}).then(r => {
console.log(r);
console.log(r.headers);
})
这里很简单XMLHttpRequest
const request = new XMLHttpRequest();
request.open('POST', endpoint);
request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader(API_KEY_HEADER, apiKey);
request.onreadystatechange = function () {
if (this.readyState === 4) {
console.log('Status:', this.status);
console.log('Headers:', this.getAllResponseHeaders());
console.log('Body:', this.responseText);
}
};
const body = {
'email': 'dummy@test.com',
'password': 'secret!'
};
request.send(JSON.stringify(body));
答案 0 :(得分:0)
2年为时已晚,但希望这对遇到相同问题的人有所帮助:
正如@shaochuancs所说,Authorization标头在响应中不是标准的,因此服务器必须显式通知以公开它。为此,服务器必须添加以下标头:
访问控制公开标题:授权
来源:https://www.yukei.net/2016/01/getting-response-headers-data-from-an-ajax-request-with-jquery/