如何用HttpInterceptor拦截角度4的响应

问题描述 投票:10回答:3

我有以下拦截器:

@Injectable()
export class TokenInterceptor implements HttpInterceptor {

  constructor(private tokenService: TokenService) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token = this.tokenService.getToken();

    if (token) {
      const authReq = req.clone({
        headers: req.headers.set('Authorization', `Bearer ${token}`)
      });

      return next.handle(authReq);
    }

    return next
      .handle(req)
//
      .getSomehowTheResponse()
      .andSaveTheTokenInStorage()
      .andPropagateNextTheResponse()
  }
}

我想从本地存储中的响应头保存令牌,所有教程都显示如何拦截请求,但不是很清楚响应。

angular angular-http-interceptors
3个回答
13
投票

next.handle(req)返回一个observable,以便您可以订阅它:

return next.handle(req).map((event: HttpEvent<any>) => {
  if (event instanceof HttpResponse) {
    // do stuff with response and headers you want
    event.headers
    event.body
  }
  return event;
})

要了解有关拦截器背后的力学的更多信息,请阅读:


4
投票

你还需要导入库

    import 'rxjs/add/operator/map';

然后你使用如下。您还需要返回事件对象,以便可以在subscribe()函数中接收它。

    return next.handle(req).map((event: HttpEvent<any>) => {
      if (event instanceof HttpResponse) {
        // do stuff with response and headers you want
      }
      return event; 
    });

0
投票

你可以尝试这个1.导入这个:

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from 
"@angular/common/http";
import { Observable } from "rxjs";
import { tap } from "rxjs/operators";

2.Incase你使用紧凑的rxjs你可以用'do'替换'tap'

export class RoleInterceptor implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler): 
Observable<HttpEvent<any>>{
return next.handle(req).pipe(tap(
event=>{
console.log('Intercepted! response',event);
}
))    
}
}
© www.soinside.com 2019 - 2024. All rights reserved.