Los Interceptores de Angular llegan para facilitar la manipulación de las peticiones que tu aplicación realiza.
Mi Primer Interceptor
Un interceptor, como su nombre indica, interceptará las solicitudes HTTP antes de que se envíen al servidor, para agregar información a las request, manipular datos, entre otras utilidades.
1. Crea el interceptor
Con el CLI de Angular, puedes crear un interceptor con el comando ng generate interceptor <interceptro_name>. En este ejemplo, generaremos un interceptor para manipular los errores HTTP en toda tu aplicación.
Importando primeramente HTTP_INTERCEPTORS desde @angular/common/http, puedes importar tu propio interceptor. Ahora, todas las solicitudes que salgan de tu aplicación, se interceptarán por el mismo.
Manejo de errores con un interceptor
Un buen uso para los interceptores es el manejo de errores. Como casi todo en Angular utiliza Observables, los interceptores no son la excepción y puedes apoyarte de RxJS para manipular la emisión de los datos del observable.
// interceptors/errors.interceptor.tsintercept(request:HttpRequest<unknown>,next:HttpHandler):Observable<HttpEvent<unknown>>{return next.handle(request).pipe(catchError((error:HttpErrorResponse)=>{if(error.status===401)returnthrowError('No posee permisos suficientes.');elseif(error.status===403)returnthrowError('Acceso prohibido.');elseif(error.status===404)returnthrowError('Registro no encontrado.');elsereturnthrowError('Ha ocurrido un error inesperado.');}),);}
Implementa esta lógica para identificar el tipo de respuesta del backend y realizar una u otra acción dependiendo el error.
Contribución creada por: Kevin Fiorentino.
Implementación de Interceptores en Angular para Medir Tiempos de Respuesta
Prácticamente permite "construir" multiples dependencias para un mismo token. Es una forma de extender un token en particular para un objeto (provider), angular utiliza esta forma para hacer hooks conectables.
/**
* When true, injector returns an array of instances. This is useful to allow multiple
* providers spread across many files to provide configuration information to a common token.
*/
multi?: boolean;
Estoy implementando el interceptor para el token pero no entiendo porque al inspeccionar el codigo en red no me muestra como tal la informacion de Authorization, sabes porque sucede esto?
La propiedad providers se utiliza principalmente para la inyección de dependencias en Angular. Al declarar un servicio o proveedor en la lista de providers, Angular se encarga de crear instancias de esos servicios y proporcionarlas a los componentes que los soliciten a través de la inyección de dependencias. Esto permite una mejor organización y reutilización del código, ya que los servicios pueden ser compartidos y utilizados en varios componentes de manera centralizada.
La constante HTTP_INTERCEPTORS se utiliza como un token de inyección de dependencias para registrar los interceptores en la propiedad providers del módulo. Al hacerlo, Angular sabe que debe buscar todas las implementaciones de HttpInterceptor registradas y aplicarlas a las solicitudes HTTP en el orden en que se agregaron.
Pero ¿por qué no inyectamos el interceptor como se fuera un servicio normal?
Porque además de inyectarlo necesitamos registrarlo en una cadena o cola de interceptores que se ejecutarán antes de enviar una solicitud HTTP. Esto permite que varios interceptores realicen diferentes tareas de manipulación en las solicitudes antes de que se envíen al servidor.
En otras palabras, si lo inyectamos como root, si podremos acceder a él desde cualquier parte del modulo pero no se inyectara en la cadena de interceptores.
No directamente si estás manejando una Single Page App, la magia está en que una vez cargada la aplicación puede enviar peticiones asíncronas y estas se ven en la red, una forma de ocultarlas es hacer SSR, pero solo funcionaría para las peticiones iniciales.
Pero igual si manejas seguridad como https y tokens no es algo de que preocuparse... no mucho....
Podemos observar que en nuestro provider utiliza la propiedad multi: true, esto permitirá agregar más interceptors si lo requerímos y no sobre escribir nuestro interceptor. En otras palabras, crean un array con el mismo provider token (HTTP_INTERCEPTORS). En este punto, nuestro interceptor modificará cada petición que se haga al servidor siempre y cuando exista un token.
Extracto del sig. post:
Angular: Autenticación usando interceptors.
Es la forma de decirle a Angular que un provider puede tener múltiples valores, entonces lo que retorna el inyector puede ser una lista de instancias, un ejemplo: