Angular 애플리케이션에 여러 HTTP 인터셉터 추가


85

Angular 4 애플리케이션에 여러 개의 독립적 인 HTTP 인터셉터를 추가하는 방법은 무엇입니까?

providers두 개 이상의 인터셉터로 배열을 확장하여 추가하려고했습니다 . 그러나 마지막 하나만 실제로 실행되고 Interceptor1무시됩니다.

@NgModule({
  declarations: [ /* ... */ ],
  imports: [ /* ... */ HttpModule ],
  providers: [
    {
      provide: Http,
      useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions) =>
        new Interceptor1(xhrBackend, requestOptions),
      deps: [XHRBackend, RequestOptions],
    },
    {
      provide: Http,
      useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions) =>
        new Interceptor2(xhrBackend, requestOptions),
      deps: [XHRBackend, RequestOptions]
    },
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

분명히 그것들을 단일 Interceptor클래스 로 결합 할 수 있으며 작동합니다. 그러나 이러한 인터셉터는 완전히 다른 목적을 가지고 있기 때문에 피하고 싶습니다 (하나는 오류 처리 용, 하나는 로딩 표시기 표시 용).

그렇다면 여러 인터셉터를 어떻게 추가 할 수 있습니까?


2
을 (를) 재정의하고 Http있습니다. 마지막 재정의 만 사용됩니다. Interceptor1은 무시되지 않고 존재하지 않습니다. 인터셉터가 포함 된 HttpClient를 사용할 수 있습니다.
Estus Flask

@estus "인터셉터가 포함 된 HttpClient를 사용할 수 있습니다."란 무엇을 의미합니까?
str


당신은 사용 요청, 응답에 대해 서로 다른 인터셉터를 사용하여 이 문제를 당신은 오류 처리, 로더 표시를 할 수있는 함께.
nivas

이 질문에 대한 업데이트가 있습니까?
Renil 바부

답변:


162

Http둘 이상의 사용자 정의 구현을 허용하지 않습니다. 그러나 @estus가 언급했듯이 Angular 팀은 최근 여러 인터셉터 개념을 지원 하는 새로운 HttpClient 서비스 (릴리스 4.3)를 추가했습니다 . HttpClient이전 .NET과 마찬가지로 확장 할 필요가 없습니다 Http. HTTP_INTERCEPTORS대신 다음 'multi: true'옵션을 사용 하여 배열이 될 수 있는 구현을 제공 할 수 있습니다 .

import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';
...

@NgModule({
  ...
  imports: [
    ... ,
    HttpClientModule
  ],
  providers: [
    ... ,
    {
      provide: HTTP_INTERCEPTORS,
      useClass: InterceptorOne,
      multi: true,
    },
    {
      provide: HTTP_INTERCEPTORS,
      useClass: InterceptorTwo,
      multi: true,
    }
  ],
  ...
})

인터셉터 :

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

@Injectable()
export class InterceptorOne implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log('InterceptorOne is working');
    return next.handle(req);
  }
}

@Injectable()
export class InterceptorTwo implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log('InterceptorTwo is working');
    return next.handle(req);
  }
}

이 서버 호출은 두 인터셉터의 로그 메시지를 인쇄합니다.

import {HttpClient} from '@angular/common/http';
...

@Component({ ... })
export class SomeComponent implements OnInit {

  constructor(private http: HttpClient) {}

  ngOnInit(): void {
    this.http.get('http://some_url').subscribe();
  }
}

4
api한 사람 만 전화를 가로 챌 수 있다고 말하는 방법이 interceptor있습니까? 또는 어떤 조건으로?
k11k2

@ k11k2 및 검색하는 모든 사람을 위해 여기에 대한 질문과 답변이 있습니다. stackoverflow.com/questions/45781379/… 나는 여전히 그것에 대해 약간 혼란스러워하고 있음을 인정합니다.
trollkotze

왜 @Injectable ()이어야합니까? 그것은 나를 위해 @Injectable ()없이 작동
makkasi

1
@makkasi : 인터셉터 클래스가 자체 종속성 주입을 수행해야하는 경우 @Injectable을 추가해야합니다. 주어진 예에서는 필요하지 않습니다
jintoppy

인터셉터 주문을 수정하는 방법은 무엇입니까?
AmirReza-Farahlagha
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.