首页 > 解决方案 > 无法在 Angular 中看到添加到 HTTP 请求的标头

问题描述

大致遵循这个答案并检查有关标头操作的 Angular 文档,我添加了以下拦截器类(如此所示)。

注意。它被调用并且对请求对象的其他操作(例如使其成为 HTTPS 等)起作用。但是,添加/附加和更新/设置的标题似乎都没有显示。

export class CoolInterceptor implements HttpInterceptor {
  intercept(request: HttpRequest<any>, next: HttpHandler)
    : Observable<HttpEvent<any>> {

    request.headers.append("Shazoo", "Hazaa");
    request.headers.set("Content-Type", "application/text");

    console.log(request.headers);

    return next.handle(request);
  }
}

出于某种原因,显示的对象不包含操纵的标题。我得到以下内容。

HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, headers: Map(0)}

如果我手动运行appendset在控制台中运行,我会看到对象发生了一些变化。遗憾的是,它没有告诉我lazyArray现在包含一个元素的任何有用信息,也没有告诉我为什么它在执行期间打印时不包含任何内容。

HttpHeaders {normalizedNames: Map(0), lazyUpdate: Array(1), headers: Map(0), lazyInit: HttpHeaders}

我已经研究了一段时间,我相信我做对了,除了一些我无法检测或诊断的小错误。

如何在拦截器中更改请求的标头对象?

或者,尽管有文档,但拦截器对于此类功能的位置选择是否不佳?那将遵循这个建议。我还看到有人RequestOptions通过和/或通过改变this.http.get(...)注入的参数来提出不同的方法HttpClient,就像这样

标签: angularhttphttp-headershttpclient

解决方案


seton 方法HttpHeaders不会改变对象,但会创建一个副本。因此,虽然

    request.headers.set("Content-Type", "application/text");

不起作用, [编辑:request本身是不可变的,因此需要克隆]

    const clonedWithRequiredHeaders = request.clone({
        setHeaders: {"Content-Type": "application/text"},
    })

应该。


推荐阅读