2017-09-28 7 views
0

私は私が記事を動的にトークンを取得するためのAuthServiceを使用する各HTTP呼び出し角度4.3xから動的なHTTPのインターセプター

@Injectable() 
export class TokenInterceptor implements HttpInterceptor { 
    constructor(public auth: AuthService) {} 
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 

    request = request.clone({ 
     setHeaders: { 
     Authorization: `Bearer ${this.auth.getToken()}` 
     } 
    }); 
    return next.handle(request); 
    } 
} 

にヘッダを追加できます。httpインターセプタを作成するために、メディアからthis articleを追いました。しかし、AuthServiceにHttpClientを注入するとすぐに、私は循環注入エラーが発生します。

インターセプタを動的に調整できる他の方法はありますか?

+0

あなたが要求を開始しているところから、あなたのサービスコードを共有することができますか? –

答えて

4

AngularJSと角度の両方に循環依存を回避するための従来の方法は、インプレースではなく、プロバイダのインスタンス上で別のプロバイダインスタンスを取得することです:インターセプタはすべてHttpClientの要求に適用される場合は、その

export class TokenInterceptor implements HttpInterceptor { 
    constructor(public auth: AuthService, public injector: Injector) {} 
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    const httpClient = injector.get(HttpClient); 
    ... 
    } 
} 

お知らせ、それはインターセプタ自体の内部で行われ、無限の再帰をもたらす可能性のあるものに適用されます。これを避けるために、要求は(例えば、カスタムヘッダーを介して)インターセプタをスキップするようにマークすることができる。

+0

このような状況では、インジェクタを使用すると非常に便利です。 HttpClientとHttpInterceptor(JSONからの翻訳をロードするために使われる)に依存するTranslateServiceがあり、それ自体のインターセプタは翻訳サービスに依存してリクエスト内でロケールパラメータを送信することになっているとします。あなたはループを起こす。 –

-3

articleから、それは言う:

角の新しいHttpClientを からの角度/共通/ HTTP @は角/ HTTP @ からここにいないのHttpクラスを使用していることに留意すべきです。私たちは、伝統的な Httpclassとの要求をしようとした場合、インターセプタは

を打つことはありませんあなたはインポートセクションでimport { HttpClient } from '@angular/common/http';を使用していることを確認してください。

し、それコンストラクタはそれを使用する:constructor(public http: HttpClient) {}

関連する問題