Angular如何对请求进行拦截封装?

 4805

Angular如何对请求进行拦截封装?下面本篇文章给大家介绍一下Angular中实现请求拦截的方法,希望对大家有所帮助!


Angular如何对请求进行拦截封装?


我们的接口是单独编写的处理的,在实际的开发项目中,有众多的接口,有些需要登陆凭证,有些不需要。一个一个接口处理不妥,我们是否可以考虑对请求进行拦截封装呢?

本文章来实现下。

区分环境

我们需要对不同环境下的服务进行拦截。在使用 angular-cli 生成项目的时候,它已经自动做好了环境的区分,在 app/enviroments 目录下:

  1. environments                                          
  2. ├── environment.prod.ts                  // 生产环境使用的配置
  3. └── environment.ts                       // 开发环境使用的配置

我们对开发环境进行修改下:

  1. // enviroment.ts
  2.  
  3. export const environment = {
  4.   baseUrl: '',
  5.   production: false
  6. };

baseUrl 是在你发出请求的时候添加在请求的前面的字段,他指向你要请求的地址。我什么都没加,其实等同加了 http://localhost:4200 的内容。

当然,你这里添加的内容要配合你代理上加的内容调整,读者可以自己思考验证

添加拦截器

我们生成服务 http-interceptor.service.ts 拦截器服务,我们希望每个请求,都经过这个服务。

  1. // http-interceptor.service.ts
  2.  
  3. import { Injectable } from '@angular/core';
  4. import {
  5.   HttpEvent,
  6.   HttpHandler,
  7.   HttpInterceptor, // 拦截器
  8.   HttpRequest, // 请求
  9. } from '@angular/common/http';
  10.  
  11. import { Observable } from 'rxjs';
  12. import { tap } from 'rxjs/operators';
  13.  
  14. import { environment } from 'src/environments/environment';
  15.  
  16. @Injectable({
  17.   providedIn: 'root'
  18. })
  19. export class HttpInterceptorService implements HttpInterceptor {
  20.  
  21.   constructor() { }
  22.  
  23.   intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  24.     let secureReq: HttpRequest<any> = req;
  25.  
  26.     secureReq = secureReq.clone({
  27.       url: environment.baseUrl + req.url
  28.     });
  29.  
  30.     return next.handle(secureReq).pipe(
  31.       tap(
  32.         (response: any) => {
  33.           // 处理响应的数据
  34.           console.log(response)
  35.         },
  36.         (error: any) => {
  37.           // 处理错误的数据
  38.           console.log(error)
  39.         }
  40.       )
  41.     )
  42.   }
  43. }

要想拦截器生效,我们还得在 app.module.ts 上注入:

  1. // app.module.ts
  2.  
  3. import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
  4. // 拦截器服务
  5. import { HttpInterceptorService } from './services/http-interceptor.service';
  6.  
  7. providers: [
  8.   // 依赖注入
  9.   {
  10.     provide: HTTP_INTERCEPTORS,
  11.     useClass: HttpInterceptorService,
  12.     multi: true,
  13.   }
  14. ],

验证

到这里,我们已经成功的实现了拦截器。如果你运行 npm run dev,你会在控制台上看到下面的信息:


Angular如何对请求进行拦截封装?


想要验证是否需要内容凭证才能访问内容,这里我使用了 [post] https://jimmyarea.com/api/private/leave/message 的接口尝试,得到如下错误:


Angular如何对请求进行拦截封装?



后端已经处理这个接口需要凭证才可以进行操作,所以直接报错 401

那么,问题来了。我们登陆之后,需要怎么带上凭证呢?

如下,我们修改下拦截器内容:

  1. let secureReq: HttpRequest<any> = req;
  2. // ...
  3. // 使用 localhost 存储用户凭证,在请求头带上
  4. if (window.localStorage.getItem('ut')) {
  5.   let token = window.localStorage.getItem('ut') || ''
  6.   secureReq = secureReq.clone({
  7.     headers: req.headers.set('token', token)
  8.   });
  9. }
  10.  
  11. // ...

这个凭证的有效期,需要读者进入系统的时候,判断一下有效期是否有效,再考虑重置 localstorage 的值,不然会一直报错,这个也是很简单,对 localstorage 进行相关的封装方便操作即可~


本文网址:https://www.zztuku.com/detail-11675.html
站长图库 - Angular如何对请求进行拦截封装?
申明:本文转载于《掘金社区》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐