当前位置: 首页
前端开发
Angular项目利用拦截器处理HttpClient请求响应

Angular项目利用拦截器处理HttpClient请求响应

热心网友 时间:2026-06-17
转载

在Angular项目开发中,拦截器(HttpInterceptor)是处理HTTP请求与响应的核心工具,尤其适合统一管理全局逻辑,例如自动附加认证Token、集中处理错误信息以及记录请求日志等场景。当前采用Angular 17.3版本,该版本已原生支持拦截器机制,配置流程简洁直观,能够有效提升开发效率。

下面直接进入具体操作步骤。

1:为何使用拦截器处理 httpClient 请求与响应,其核心价值主要体现在:

拦截器允许你在请求发出之前或响应返回之后注入自定义逻辑。例如在请求头中自动携带认证Token,或者在捕获401错误时引导用户跳转至登录页面。这种做法的优势在于:业务代码中无需反复编写这些通用逻辑,只需一次配置,即可全局生效,大幅提升代码复用性与维护性。

2:创建拦截器服务:ng g s services/myhttp-interceptorService

首先通过Angular CLI生成一个服务类,用于实现拦截器接口。注意,该服务必须实现HttpInterceptor接口,并重写其中的intercept方法,以便嵌入自定义处理逻辑。

 import { Injectable } from '@angular/core';
  import { HttpResponse, HttpRequest, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http';
  import { Observable, tap } from 'rxjs';
  
  @Injectable({
    providedIn: 'root'
  })
  // 用作http 请求响应的拦截器
  export class MyhttpInterceptorServiceService implements HttpInterceptor {
   constructor() { }
   intercept(req: HttpRequest, next: HttpHandler): Observable> {
     // 请求前处理,可以加上 head 的token 如果需要
     //console.log('Request:', req.url);
     console.log('Request:=======请求前的处理=========' + req.url);
     if (!req.headers.has('Authorization')) {
       req = req.clone({
         setHeaders: {
           Authorization: 'Bearer ' + localStorage.getItem('logininfo')
         }
       });
       console.log("请求头新增token 成功 Authorization-----------");
     } else {
       console.log("已经存在token,不需要新增");
     }
     // 发送请求,并且在响应上做文章
     return next.handle(req).pipe(
       tap(
         event => {
           if (event instanceof HttpResponse) {
             // 成功响应时的处理
             //console.log('Response:', event.status);
             console.log('Response:====成功响应的处理============');
           }
         },
         error => {
           // 错误响应时的处理
           //console.error('Error:', error.message);
           console.error('Error', '=======error msg=========');
         }
       )
     );
   }
 }

上述代码主要完成两项任务:首先检查请求头中是否已存在Authorization字段,若不存在则从localStorage中获取Token并自动添加;随后在响应端利用tap操作符分别处理成功与失败的响应结果。在实际项目中,你还可以在错误处理环节根据HTTP状态码执行页面跳转或用户提示等操作。

3:在根模块中注册拦截器 app.module.ts

拦截器编写完成后,还需要在根模块中将其注册到HTTP_INTERCEPTORS提供者数组中。请特别注意multi: true这一配置项,因为它允许项目中同时存在多个拦截器并协同工作。

 import { NgModule } from '@angular/core';
  import { BrowserModule } from '@angular/platform-browser';
  import { AppRoutingModule } from './app-routing.module';
  import { AppComponent } from './app.component';
  import { HomeComponent } from './components/home/home.component';
  import { TopComponent } from './components/top/top.component';
  import { MenuComponent } from './components/menu/menu.component';
  import { ProductComponent } from './components/product/product.component';
 //primeng
 import {ButtonModule} from 'primeng/button';
 import { FormsModule } from '@angular/forms';
 import {CalendarModule} from 'primeng/calendar';
 import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
 import {PanelMenuModule} from 'primeng/panelmenu';
 import { BodyComponent } from './components/body/body.component';
 import {TableModule} from 'primeng/table'
 import {InputTextModule} from 'primeng/inputtext';
 import {MessageModule} from 'primeng/message';
 import {ToastModule} from 'primeng/toast';
 import { TranslateModule,TranslateLoader } from '@ngx-translate/core';
 import { HttpClient, HttpClientModule } from '@angular/common/http';
 import { TranslateHttpLoader } from '@ngx-translate/http-loader';
 import { MydialogComponent } from './components/mydialog/mydialog.component';
 import { MybooksComponent } from './components/mybooks/mybooks.component';
 import { StudentComponent } from './components/student/student.component';
 import { TeacherComponent } from './components/teacher/teacher.component';
 import { WelcomeComponent } from './components/welcome/welcome.component';
 import { LoginComponent } from './components/login/login.component';
 //HttpClientModule, HTTP_INTERCEPTORS -----拦截器的导入
 import { HTTP_INTERCEPTORS } from '@angular/common/http';
 import { MyhttpInterceptorServiceService } from './services/myhttp-interceptor-service.service';
 export function HttpLoaderFactory(http: HttpClient) {
   return new TranslateHttpLoader(http,'../assets/i18n/',".json");
 }
 @NgModule({
   declarations: [
     AppComponent,
     HomeComponent,
     TopComponent,
     MenuComponent,
    ProductComponent,
     BodyComponent,
     MydialogComponent,
    MybooksComponent,
     StudentComponent,
     TeacherComponent,
     WelcomeComponent,
     LoginComponent
  ],
   imports: [
     BrowserModule,
     AppRoutingModule,
     BrowserAnimationsModule,
     ButtonModule,
     FormsModule,
     CalendarModule,
     PanelMenuModule,
     TableModule,
     InputTextModule,
    MessageModule,
    ToastModule,
 HttpClientModule,TranslateModule.forRoot({
  loader: {
     provide: TranslateLoader,
     useFactory: HttpLoaderFactory,
     deps: [HttpClient]
   }
 })
   ],
   providers: [{
     provide: HTTP_INTERCEPTORS,   //---------------
     useClass: MyhttpInterceptorServiceService,
     multi: true   // 注意这里设置为true,因为可以有多个拦截器
   }],
   bootstrap: [AppComponent]
})
export class AppModule { }

重点关注providers部分的配置,具体代码如下:

//重点如下配置:HttpClientModule, HTTP_INTERCEPTORS 拦截器的导入
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { MyhttpInterceptorServiceService } from './services/myhttp-interceptor-service.service';
  providers: [{
    provide: HTTP_INTERCEPTORS,
    useClass: MyhttpInterceptorServiceService,
    multi: true   // 注意这里设置为true,因为可以有多个拦截器
  }],

完成上述配置后,所有通过Angular HttpClient发起的HTTP请求都将自动经过此拦截器,实现统一处理。

4:在组件中测试拦截器效果

直接在组件中注入HttpClient并发起请求,即可验证拦截器是否正常工作。以下是一个简单的测试组件示例:

student works! 请求接口获取到用户名称为:{{userName}}

import { Component, OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; @Component({ selector: 'app-student', templateUrl: './student.component.html', styleUrl: './student.component.scss' }) export class StudentComponent implements OnInit { userName: string; constructor(private http: HttpClient) { this.userName = ""; } ngOnInit(): void { this.http.get('http://www.baidu.com:4200/gateway/basic/accounts/getUserAcountList?ntid=3793831').pipe().subscribe((data?: any) => { console.log(data); this.userName = data.data[0].name; }) } }

请确保在app.module.tsdeclarations数组中注册了该组件。启动项目后,打开浏览器控制台,若请求头中已自动包含Authorization字段,则表明拦截器已成功生效。

5:测试验证与效果展示

\

请求发出后,我们可以在控制台中看到拦截器打印的请求处理日志,同时响应端也会正常输出成功信息。如果服务端返回错误,拦截器将自动捕获并打印相关错误详情。

以上就是Angular项目中使用拦截器处理httpClient请求与响应的完整实现流程。从生成服务、编写拦截逻辑,到配置模块、测试验证,每个环节都清晰明了,能够帮助开发者快速将其集成到现有项目中,实现HTTP请求的统一管理与优化。

来源:https://www.jb51.net/javascript/322899m86.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
深入理解调用栈与异步任务的状态同步机制

深入理解调用栈与异步任务的状态同步机制

调用栈仅记录同步执行流,异步回调由事件循环调度、任务队列存放,闭包维持作用域。执行时新建上下文入栈,不复用旧栈帧。调用栈不主动同步异步状态,事件循环是真正的协调者。

时间:2026-07-08 06:57
HTML自定义元素实现跨组件通信的完整指南

HTML自定义元素实现跨组件通信的完整指南

自定义元素跨组件通信需依赖CustomEvent,且bubbles和composed必须同时设为true才能穿透ShadowDOM。事件监听应挂载在document或父容器等合适节点,避免使用DOM查找或data ARIA属性替代事件通信,从而确保事件正确穿越边界,保持跨组件通信的可靠性。

时间:2026-07-08 06:56
JavaScript static关键字在工具库构建中的应用

JavaScript static关键字在工具库构建中的应用

在JavaScript工具库构建中,static关键字将函数或常量挂载到类名上,无需实例化即可调用,适用于无状态操作如日期格式化、字符串截断、深克隆,并统一管理配置常量与实现工厂方法,但需避免依赖实例状态。

时间:2026-07-08 06:56
如何避免静态初始化块异常导致应用冷启动中断

如何避免静态初始化块异常导致应用冷启动中断

防范静态初始化失败导致应用中断,需用try-catch兜住异常并提供安全默认值;将高风险逻辑移出static块,改用延迟加载或Holder模式;显式控制初始化顺序并增强可观测性;诊断时直击ExceptionInInitializerError的根因。

时间:2026-07-08 06:56
虚拟DOM标签级diff比对优化过程详解

虚拟DOM标签级diff比对优化过程详解

虚拟DOMdiff以节点为单位,按层级同标签优先判断复用,通过key精准识别节点身份,配合细粒度属性更新及短路优化,避免全量递归比较,只更新变化的节点,跳过冗余计算,将时间复杂度从O(n³)降至接近O(n),从而大幅提升渲染性能。

时间:2026-07-08 06:56
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜