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.
Crear interceptor -->
ng g interceptor interceptors/time --flat
Para qué sirve multi: true?
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;
Buenos días:
Me gustaria saber que significa ese multi que colocaste al configurar el interceptor en el modulo
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:
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?
Los interceptores y los middleware es lo mismo ?
la diferencia es que los interceptor son recursos de angular, que nos permiten tener esa funcionalidad.
No entendi por que se hacen 2 peticiones. Cual valor del time de las dos es la que debemos d tener en cuenta para ver temas de performance?
que es un provider en angular?
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.
Espero haber ayudado!
Saludos!
Hay alguna forma de ocultar las peticiones en la red?
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....
Tengo una duda en el minuto 6:32, para que sirve el multi en true ? si va en false que pasa ?
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.
Si estan usando angular 16+ el provider se configura en app.config.ts y de esta manera: