How to intercept the response in angular 4 with HttpInterceptor

13.6k Views Asked by At

I do have the following Interceptor:

@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()
  }
}

And I want to save the token from the response header in local storage, all the tutorials are showing how to intercept the request, but not very clearly the response.

3

There are 3 best solutions below

5
On BEST ANSWER

next.handle(req) returns an observable so you can subscribe to it:

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

To learn more about mechanics behind interceptors read:

0
On

You can try this:

Step 1: Import this:

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

import { Observable } from "rxjs";

import { tap } from "rxjs/operators";

Step 2: In case you are using compact rxjs you can replace 'tap' with '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);
                }
            ))    
    }
}
0
On

you also need to import library

    import 'rxjs/add/operator/map';

then you use as below. you also need to return the event object so that it can be received in your subscribe() function.

    return next.handle(req).map((event: HttpEvent<any>) => {
      if (event instanceof HttpResponse) {
        // do stuff with response and headers you want
      }
      return event; 
    });