私は次のインターセプターを持っています:
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
constructor(private tokenService: TokenService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = this.tokenService.getToken();
if (token) {
const authReq = req.clone({
headers: req.headers.set('Authorization', `Bearer ${token}`)
});
return next.handle(authReq);
}
return next
.handle(req)
//
.getSomehowTheResponse()
.andSaveTheTokenInStorage()
.andPropagateNextTheResponse()
}
}
そして、私はローカルストレージの応答ヘッダーからトークンを保存したいのですが、すべてのチュートリアルでは、要求をインターセプトする方法を示していますが、応答はあまり明確ではありません。
next.handle(req)
はオブザーバブルを返すため、サブスクライブできます。
return next.handle(req).map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
// do stuff with response and headers you want
event.headers
event.body
}
return event;
})
インターセプターの背後にあるメカニズムの詳細については、以下をご覧ください。
ライブラリもインポートする必要があります
import 'rxjs/add/operator/map';
その後、次のように使用します。また、subscribe()関数で受信できるように、イベントオブジェクトを返す必要があります。
return next.handle(req).map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
// do stuff with response and headers you want
}
return event;
});
これを試すことができます1.これをインポートします:
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from
"@angular/common/http";
import { Observable } from "rxjs";
import { tap } from "rxjs/operators";
2.コンパクトなrxjsを使用している場合は、「tap」を「do」に置き換えることができます
export class RoleInterceptor implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>>{
return next.handle(req).pipe(tap(
event=>{
console.log('Intercepted! response',event);
}
))
}
}