En el artículo anterior, utilizando el proxy Api en Angular, abordamos el problema de la interfaz de depuración conjunta local y el proxy utilizado.
Nuestras interfaces se escriben y procesan por separado. En proyectos de desarrollo reales, hay muchas interfaces, algunas de las cuales requieren credenciales de inicio de sesión y otras no. Si cada interfaz no se maneja adecuadamente, ¿podemos considerar interceptar y encapsular la solicitud? [Tutoriales relacionados recomendados: "Tutorial angular"]
Este artículo se implementará.
Para distinguir entre entornos
, necesitamos interceptar servicios en diferentes entornos. Al usar angular-cli
para generar un proyecto, ha distinguido automáticamente los entornos en el directorio app/enviroments
:
entornos.
├── entorno.prod.ts // Configuración utilizada en el entorno de producción └── entorno.ts // Configuración utilizada en el entorno de desarrollo
Modifiquemos el entorno de desarrollo:
// enviroment.ts exportar entorno constante = { URL base: '', producción: falso };
baseUrl
es un campo agregado delante de la solicitud cuando realiza la solicitud. Apunta a la dirección que desea solicitar. No agregué nada. De hecho, fue equivalente a agregar el contenido de http://localhost:4200
.
Por supuesto, el contenido que agregue aquí debe ajustarse para que coincida con el contenido agregado en su proxy. Los lectores pueden pensar y verificar por sí mismos.
Generamos
el servicio interceptor http-interceptor.service.ts
. La solicitud pasará por este servicio.
// http-interceptor.service.ts importar {Inyectable} desde '@angular/core'; importar { evento http, HttpHandler, HttpInterceptor, // Interceptor HttpRequest, // Solicitud} de '@angular/common/http'; importar {Observable} desde 'rxjs'; importar {toque} desde 'rxjs/operadores'; importar {entorno} desde 'src/environments/environment'; @Inyectable({ proporcionado en: 'raíz' }) exportar clase HttpInterceptorService implementa HttpInterceptor { constructor() { } interceptar(req: HttpRequest<cualquiera>, siguiente: HttpHandler): Observable<HttpEvent<cualquier>> { let SecureReq: HttpRequest<cualquier> = req; SecureReq = SecureReq.clon ({ URL: entorno.baseUrl + solicitud.url }); devolver siguiente.handle(secureReq).pipe( grifo( (respuesta: cualquiera) => { // Procesa los datos de respuesta console.log(respuesta) }, (error: cualquiera) => { // Manejar datos de error console.log(error) } ) ) } }
Para que el interceptor surta efecto, debemos inyectarlo en app.module.ts
:
// app.module.ts importar {HttpClientModule, HTTP_INTERCEPTORS} desde '@angular/common/http'; // Importación del servicio interceptor { HttpInterceptorService } desde './services/http-interceptor.service'; proveedores: [ // Inyección de dependencia { proporcionar: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, múltiple: verdadero, } ],
Verificación
en este punto, hemos implementado exitosamente el interceptor. Si ejecuta npm run dev
, verá el siguiente mensaje en la consola:
Para verificar si se requieren credenciales de contenido para acceder al contenido, aquí utilicé la interfaz [post] https://jimmyarea.com/api/private/leave/message
para intentar y obtuve el siguiente error:
El backend ya ha procesado que esta interfaz requiere credenciales para funcionar, por lo que se informa directamente un error 401
.
Entonces aquí viene el problema. Después de iniciar sesión, ¿cómo debemos traer nuestras credenciales?
De la siguiente manera, modificamos el contenido del interceptor:
let SecureReq: HttpRequest<any> = req; //... // Utilice localhost para almacenar las credenciales del usuario en el encabezado de la solicitud if (window.localStorage.getItem('ut')) { let token = ventana.localStorage.getItem('ut') || SecureReq = SecureReq.clon ({ encabezados: req.headers.set('token', token) }); } //...
El período de validez de este certificado requiere que los lectores juzguen si el período de validez es válido al ingresar al sistema y luego consideren restablecer el valor de localstorage
; de lo contrario, siempre se informarán errores. Esto también es muy simple. la encapsulación del localstorage
es conveniente para la operación Sí ~
[Fin]