インターセプターを使用して一部のサービスを除外したかった。
app.module.js
providers: [
UserService,
RolesService,
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptor,
multi: true
},
],
Login.service.ts
return this.httpClient.post(this.appUrl + '/oauth/token', body.toString(), { headers, observe: 'response' })
.map((res: Response) => {
const response = res.body;
this.storeToken(response);
return response;
})
.catch((error: any) => {
ErrorLogService.logError(error);
return Observable.throw(new Error(error.status));
});
}
要求されたコメントだけでなくこれに答えを出すには;-)
一部のサービス(または異なるコンポーネントで使用される同じサービス)をインターセプターから除外するには、アプリケーションをモジュールに分割し、必要なモジュールでのみインターセプターを提供するのが最善です。たとえば、ログイン後または管理領域内で。
インターセプターは、@Component
宣言のproviders
プロパティ。
#Fusselの回答(上記)は機能しますが、多くの場合、すべてのコンポーネントモジュールにインターセプターサービスを含めることは良い習慣ではありません。それは直感的で生産的ではありません。インターセプターを1か所に配置し、すべてのhttp要求に対応します。 1つの方法は、urlに基づいてintercept()関数でヘッダーバインディングを除外することです。
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const re = /login/gi;
// Exclude interceptor for login request:
if (req.url.search(re) === -1 ) {
req = req.clone({
setHeaders: {
Authorization: `Bearer ${localStorage.getItem('authToken')}`
}
});
}
return next.handle(req);
}
同様の問題がありました。インターセプターが実装されると、とにかくすべてのhttp要求がハントされます。私のコードには、アクセストークンがあるかどうかに関するものでした。インターセプターよりもトークンパラメーターが ""(空の文字列)に設定されている必要があります。すべてが行くよりも。インターセプターのfnコードでは、次のように見えます。
intercept(
request: HttpRequest<any>,
next: HttpHandler**strong text**
): Observable<HttpEvent<any>> {
//how to update the request Parameters
**let token : string;
let currentUser : any = JSON.parse(localStorage.getItem('currentUser'));
if (currentUser){
token = currentUser.access_token;
}else{token = ""}**
console.log("Token dobavljen sa localStorage.getItem: ", token);
if (token) {
request = request.clone({ headers: request.headers.set('Authorization', 'Bearer ' + token) });
}
if (!request.headers.has('Content-Type')) {
request = request.clone({ headers: request.headers.set('Content-Type', 'application/json') });
}
request = request.clone({ headers: request.headers.set('Accept', 'application/json') });
//logging the updated Parameters to browser's console
console.log("Before making api call : ", token);
return next.handle(request).pipe(
tap(
event => {
//logging the http response to browser's console in case of a success
if (event instanceof HttpResponse) {
console.log("api call success :", event);
}
},
error => {
//logging the http response to browser's console in case of a failuer
if (event instanceof HttpResponse) {
console.log("api call error :", event);
}
}
)
);
//}
}