每个API的角度HTTP拦截器

问题描述

你好, 我有3种不同的API用于不同的服务。 每个API都有您自己的Auth令牌。 我想创建3个http拦截器,每个api一个。 我知道为所有项目创建一个httpInterceptor,但是如何为每个api服务创建一个不同的拦截器?

解决方法

您可以使用一个拦截器,并且由于在此拦截器中您有权读取URL,因此您可以创建一个函数,该函数使用另一个拦截器,例如:

        intercept(request: HttpRequest<unknown>,next: HttpHandler): Observable<HttpEvent<unknown>> {
          let token;
          
          if (request.url.indexOf(PATH_ROUTE_ONE) !== -1) {
            token =  localStorage.getItem(TK1);
          } else if(request.url.indexOf(PATH_ROUTE_TWO) !== -1) {
            token =  localStorage.getItem(TK2);
          } else {
            token =  localStorage.getItem(TK3);
          }

          if (token) {
            request = request.clone({
              setHeaders: {
                authorization: `Bearer ${token}`,},});
          }

          return next.handle(request).pipe(
            tap((res) => {
              if (res instanceof HttpResponse) {
                // TODO: Update token info
              }
            }),catchError((err: HttpErrorResponse) => throwError(err)),);
        }

如果您想使用3条路径,可以做同样的事情,并且只阅读URL即可知道是应用该URL还是让它继续长时间运行

       intercept(request: HttpRequest<unknown>,next: HttpHandler): Observable<HttpEvent<unknown>> {
          let token = localStorage.getItem(TK1)
          
          if (request.url.indexOf(PATH_ROUTE_ONE) !== -1) {
            request = request.clone({
              setHeaders: {
                authorization: `Bearer ${token}`,);
        }