从响应

时间:2017-05-17 18:35:39

标签: http request authorization fetch superagent

我正在开展一个我希望重用现有API的辅助项目。 API具有/auth端点,用于处理POST请求,并期望请求正文中的emailpassword。如果验证了emailpassword,则服务器返回一个响应,其中包含Authorization标头,该标头包含应在所有后续请求中发送的令牌值。

我在从响应中检索此标头时遇到问题。它在邮差和Chrome开发工具(网络部分)中都可见。 Postman Chrome开发工具: XMLHttpRequest console.log响应标头 enter image description here

我已经尝试了多个库/实现来发送请求(superagentrequestfetch实现甚至是XMLHttpRequest),但是,我得到的所有响应都有我在Chrome开发工具中查看响应标头中的Authorization标头,但是当我尝试从javascript访问标头时,我总是只获得Content-Type标头。

我在其他几个答案中读到服务器必须在标头中指定Access-Control-Expose-HeadersAccess-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));

1 个答案:

答案 0 :(得分:0)

2年为时已晚,但希望这对遇到相同问题的人有所帮助:

正如@shaochuancs所说,Authorization标头在响应中不是标准的,因此服务器必须显式通知以公开它。为此,服务器必须添加以下标头:

访问控制公开标题:授权

来源:https://www.yukei.net/2016/01/getting-response-headers-data-from-an-ajax-request-with-jquery/