游乐游手机版
首页/前端开发/文章详情

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

时间:2026-06-17 06:49
Angular项目中通过HttpInterceptor拦截器统一处理HTTP请求与响应。实现时需创建服务实现拦截接口,在请求前添加Authorization令牌,响应端使用tap处理成功或错误。最后在根模块的providers中配置HTTP_INTERCEPTORS并设置multi为true,即可全局生效。

在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(https: 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 https: HttpClient) { this.userName = ""; } ngOnInit(): void { this.http.get('https://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
上一篇Angular测试中Spy使用教程详解 下一篇AngularJS输入验证原理解析全面解读工作流程与实现
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
checked表单属性与CSS变量实现换肤原理
前端开发 · 2026-07-02

checked表单属性与CSS变量实现换肤原理

先聊一个有意思的现象:不需要编写任何 JavaScript,仅靠一个 :checked 伪类,就能驱动整个主题切换系统。听起来很神奇,但原理其实并不复杂——核心在于,:checked 是浏览器原生状态的实时镜像,而不是 JS 模拟出来的开关。 用户点击 ,或者用键盘空格键选中它,状态更新的那一刻,C

HTML meta标签页面定时跳转实现
前端开发 · 2026-07-02

HTML meta标签页面定时跳转实现

说到前端开发中最简洁的页面跳转方式,meta http-equiv= "refresh " 绝对算得上一个经典方案。不过别看它结构简单,格式上稍有疏忽,页面就可能原地卡死,或者直接跳到一个错误地址。下面把几个最容易踩坑的细节彻底讲清楚,帮你避开这些常见陷阱。 使用 http-equiv= "refresh

Cypress跨测试用例状态传递的不推荐但可选方案
前端开发 · 2026-07-02

Cypress跨测试用例状态传递的不推荐但可选方案

Cypress 默认的设计哲学很干脆:每个测试用例都必须是独立小王国,谁也不靠谁。这意味着 it() 执行前,浏览器上下文会被“一键还原”——页面状态、LocalStorage、Cookies 统统清空,强制维护测试隔离。这一规则让很多新手头疼:明明前一个测试已经创建了员工,后一个测试怎么就没法直接

全面深度解析HTML主体main标签唯一性原则与使用规范
前端开发 · 2026-07-02

全面深度解析HTML主体main标签唯一性原则与使用规范

在进行前端无障碍审计时,不少开发者会遇到一个奇怪的场景:浏览器不报错,但Lighthouse却直接标红“duplicate-main”。这其实是语义层与渲染层之间的根本差异。 为什么浏览器不报错但 Lighthouse 直接标红 duplicate-main 关键原因就在于:`main` 是语义锚点

HTML main标签在文档结构中的唯一性详解
前端开发 · 2026-07-02

HTML main标签在文档结构中的唯一性详解

先做一个快速检测:打开你最近开发的一个页面,按下 Ctrl+F 搜索 。如果搜索结果里出现2个以上,那这篇文章建议你认真读完。 本期要聊的主题,是HTML标签中一个看似简单、实际极易踩坑的核心知识点:main标签的唯一性。很多开发者知道这个标签的存在,但真正写到项目里,尤其是用了React、Vue这