角度拦截器排除特定的 url

新手上路,请多包涵

我正在编写拦截器,这样我就不必处理调用我的 web api 的每个服务中的标头。问题在于,我 99% 的调用都需要一组特定的标头,但其他 1% 的调用只需要其中一个标头,并且无法与其他存在的标头一起使用。知道这一点后,我的想法是制作 2 个拦截器,第一个将添加他们都使用的 1 个标头,第二个将添加其余标头,第二个不包括 1%。

以下是我如何排除 1%,这是有效的,但我想看看是否有更好的方法来解决这个问题:

 intercept(request: HttpRequest<any>, next:HttpHandler: Observable<HttpEvent<any>> {
  let position = request.url.indexOf('api/');
  if (position > 0){
    let destination: string = request.url.substr(position + 4);
    let matchFound: boolean = false;

    for (let address of this.addressesToUse){
      if (new RegExp(address).test(destination)){
        matchFound = true;
        break;
      }
    }

    if (!matchFound){
      ...DO WORK to add the headers
    }
  }

原文由 dmoore1181 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 536
2 个回答

我最后做的是有一个 url 数组(正则表达式格式),我不想像这样在拦截器中使用它们:

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

@Injectable()
export class AddCustomHeadersInterceptor implements HttpInterceptor {
  urlsToNotUse: Array<string>;

  constructor(
  ) {

    this.urlsToNotUse= [
      'myController1/myAction1/.+',
      'myController1/myAction2/.+',
      'myController1/myAction3'
    ];
  }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (this.isValidRequestForInterceptor(request.url)) {
      let modifiedRequest = request.clone({
        setHeaders: {
          //DO WORK HERE
        }
      });

      return next.handle(modifiedRequest);
    }
    return next.handle(request);
  }

  private isValidRequestForInterceptor(requestUrl: string): boolean {
    let positionIndicator: string = 'api/';
    let position = requestUrl.indexOf(positionIndicator);
    if (position > 0) {
      let destination: string = requestUrl.substr(position + positionIndicator.length);
      for (let address of this.urlsToNotUse) {
        if (new RegExp(address).test(destination)) {
          return false;
        }
      }
    }
    return true;
  }
}

原文由 dmoore1181 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 Angular 12 更新,使用“上下文”,请参阅此 SO

我建议,尽管检查请求,您可以使用标头添加“跳过”属性,如果标头具有跳过属性,则简单地返回请求

export class CustomInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        if (req.headers.get("skip"))
           return next.handle(req);

        ....
    }
}

然后你拨打所有你需要的电话“跳过”拦截器

this.http.get(url, {headers:{skip:"true"});

原文由 Eliseo 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题