如何在Angular 5 HttpInterceptor中添加多个头文件

Fel*_*Fel 19 angular-http-interceptors angular angular-httpclient

我正在尝试学习如何使用HttpInterceptor为应用程序对API执行的每个HTTP请求添加几个标头.我有这个拦截器:

import { Injectable } from '@angular/core';

import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';

import { Observable } from 'rxjs/Observable';


@Injectable()
export class fwcAPIInterceptor implements HttpInterceptor {
  intercept (req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

  const authReq = req.clone({
    headers: req.headers.set('Content-Type', 'application/json')
  });

  console.log('Intercepted HTTP call', authReq);

  return next.handle(authReq);
}
}
Run Code Online (Sandbox Code Playgroud)

}

除了'Content-Type'标题之外,我还需要添加'Authorization',但我不知道怎么做(Angular HttpHeaders的文档只是方法列表,没有任何解释).

我该怎么做?谢谢!

Ket*_*til 31

由于该set方法每次都返回头对象,因此您可以执行此操作.这样,来自截获的请求的原始标头也将被保留.

const authReq = req.clone({
    headers: req.headers.set('Content-Type', 'application/json')
    .set('header2', 'header 2 value')
    .set('header3', 'header 3 value')
});
Run Code Online (Sandbox Code Playgroud)

  • 这通常是您想要的方式。接受的答案将覆盖以前的所有标题,因此,如果您要这样做,就可以了;但OP要求“添加”标头,而不是全部重置标头。 (2认同)

axl*_*ode 28

@Injectable()
export class fwcAPIInterceptor implements HttpInterceptor {
  intercept (req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

  const authReq = req.clone({
    headers: new HttpHeaders({
      'Content-Type':  'application/json',
      'Authorization': 'my-auth-token'
    })
  });

  console.log('Intercepted HTTP call', authReq);

  return next.handle(authReq);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你有多个拦截器怎么办?这个会覆盖之前设置的标头,不是吗? (7认同)
  • 将原始标头包含在“new Headers()”中...只需在其中添加“...req.headers”即可。`new HttpHeaders({ ...req.headers, 'Content-Type': 'application/json' })` (2认同)
  • 为 HTTP 调用设置多个拦截器怎么会是不好的逻辑呢? (2认同)

vit*_*sai 11

如前所述-可接受的方法会覆盖标头,为添加标头,我喜欢API文档中的方法

const authReq = req.clone({ setHeaders: { Authorization: authToken } });
Run Code Online (Sandbox Code Playgroud)


Mih*_*hai 5

  const modifiedReq = req.clone({
      url: this.setUrl(req.url),
      headers: this.addExtraHeaders(req.headers)
    });
Run Code Online (Sandbox Code Playgroud)

和方法:

private addExtraHeaders(headers: HttpHeaders): HttpHeaders {
  headers = headers.append('myHeader', 'abcd');
  return headers;
} 
Run Code Online (Sandbox Code Playgroud)

方法 .append 创建一个新的 HttpHeaders 对象,添加 myHeader 并返回新对象。

使用此解决方案意味着您还可以使用多个拦截器,因为您不会覆盖标头。