角拦截器排除特定的网址

时间:2019-04-04 17:59:23

标签: javascript angular typescript

我正在编写拦截器,这样我就不必在调用我的Web API的每个服务中处理标头。问题是我的99%的呼叫需要1个特定的标头集,而其他1%的呼叫只需要其中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
    }
  }

5 个答案:

答案 0 :(得分:8)

按照Eliseo的建议检查req.headers.get("skip")后,我建议从请求中删除此标头,因为它仅与Angular相关,并且不应传输到API(实际上可能会引起问题)

const skipIntercept = request.headers.has('skip');

if (skipIntercept) {
    request = request.clone({
        headers: request.headers.delete('skip')
    });
}

答案 1 :(得分:1)

您可以尝试扩展HttpClient而不是使用拦截器。

拦截器世界中,在执行之前,每个请求都会停止-经过按摩(添加标题)。

HttpClient World 中,在客户端对象实例化时会非常小心。

如果您认为有必要,可以考虑使用不同的变体,HttpClient99Percent变体,HttpClientOnePercent变体等。

下面的链接可以帮助您抢先一步

https://medium.com/@admin_87321/extending-angular-httpclient-6b33a7a1a4d0

答案 2 :(得分:1)

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

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"});

答案 3 :(得分:1)

默认情况下创建的Http客户端将使用interseptor。如果要避免这种情况,可以使用构造函数创建HttpClient的另一个实例。

@Injectable()
class Service {
  private customHttpClient: HttpClient;

  constructor(backend: HttpBackend) {
    this.customHttpClient = new HttpClient(backend);
  }
}

customHttpClient将不会使用inteseptor。

答案 4 :(得分:0)

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

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;
  }
}