Angular 2 http Observable 请求不返回响应头

mad*_*e94 2 javascript http angular

我正在使用 Angular 2.2.3 并使用 rxjs 使用 observables 执行 http 请求。标头显示在 Chrome 控制台中,但响应中标头对象上的标头列表为空。这是代码:

登录功能

login(body: Object): Observable<Response> {
    return this.http.post(this.url, body);
}
Run Code Online (Sandbox Code Playgroud)

订阅可观察对象的登录函数调用

this.authService.login(values).subscribe(res => {
    console.log(res.headers.get("Authorization"))
    console.log(res)
},
err => {
    console.log(err);
});
Run Code Online (Sandbox Code Playgroud)

有什么我做错了或者我应该做不同的事情吗?

Chrome 网络控制台响应标头

这是 Chrome 控制台中“授权肯定存在”的响应

Console.log 结果

null值为res.headers.get("Authorization") 如您所见,标题列表为空。 Chrome 控制台

非常感谢您的帮助!

mad*_*e94 7

我已经找到了解决我的问题的方法。事实证明,Angular在幕后使用了XMLHttpRequest。因此,可以“以编程方式”(使用 Angular 的函数)向客户端显示的标头必须在标头列表中Access-Control-Expose-Headers。当我们将请求发送回客户端时,必须在后端创建此列表。这是我使用 ExpressJS 执行的操作以启用 Authorization 标头:

app.use((req, res, next) => {
  // List of headers that are to be exposed to the XHR front-end object
  res.header('Access-Control-Expose-Headers', 'Authorization');
  next();
});
Run Code Online (Sandbox Code Playgroud)

我在前端初始码保持不变并且console.log所述的Authorization报头现在显示。

解释我们为什么需要这个标题的文档

整个文档非常有趣,我认为我在 API 方面做得很好,但在阅读本文时我学到了很多 :-)

  • 我遇到了同样的问题。该文档说“Access-Control-Expose-Headers 标头允许浏览器访问的服务器白名单标头”。为什么 Chrome 网络控制台可以得到那些响应头?我想知道它是否也使用`XMLHttpRequest`? (2认同)