【发布时间】:2017-10-17 08:46:14
【问题描述】:
我正在处理一个我想重用现有 API 的副项目。
API 有一个 /auth 端点,它处理 POST 请求,并在请求正文中期望 email 和 password。如果验证了email 和password,则服务器返回包含Authorization 标头的响应,该标头包含应在所有后续请求中发送的令牌的值。
我在从响应中检索此标头时遇到问题。它在 Postman 和 Chrome 开发工具(网络部分)中都可见。
Chrome 开发工具:
console.log 的响应头
我已经尝试了多个库/实现来发送请求(superagent、request、fetch 实现甚至XMLHttpRequest),但是,我得到的所有响应在响应中都有Authorization 标头当我在 Chrome 开发工具中查看标头时,但当我尝试从 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));
【问题讨论】:
-
Authorization是标准请求标头,而不是响应标头。请查看en.wikipedia.org/wiki/… -
顺便说一句,你能发布发送 POST 请求的代码吗?
标签: http request authorization fetch superagent