Angular项目简单使用拦截器 httpClient 请求响应处理

angular,httpclient · 浏览次数 : 0

小编点评

本文介绍了在Angular项目中使用拦截器来处理HTTP请求和响应的方法。拦截器是一种在请求发送之前或之后拦截HTTP请求和响应的机制,可用于添加身份验证头、错误处理、日志记录等功能。 ### 1. 使用拦截器的原因 在Angular应用程序中,使用拦截器的主要原因是: - 添加请求头:例如身份验证令牌。 - 统一处理错误:对所有请求的错误进行集中处理。 - 记录日志:跟踪请求和响应的详细信息。 ### 2. 具体操作步骤 以下是在Angular中实现请求和响应拦截器的具体步骤: #### 2.1 定义拦截器服务 使用`@Injectable()`装饰器创建一个拦截器服务,实现`HttpInterceptor`接口。 ```typescript import { Injectable } from '@angular/core'; import { HttpResponse, HttpRequest, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http'; @Injectable() export class MyhttpInterceptorServiceService implements HttpInterceptor { // ... } ``` #### 2.2 实现拦截器逻辑 在拦截器的`intercept()`方法中,你可以添加自定义的逻辑,例如添加请求头或处理响应。 ```typescript intercept(req: HttpRequest, next: HttpHandler): Observable> { // 请求前处理 if (!req.headers.has('Authorization')) { req = req.clone({ setHeaders: { Authorization: 'Bearer ' + localStorage.getItem('logininfo'), }, }); } // 发送请求 return next.handle(req).pipe( tap( (event) => { // 成功响应时的处理 console.log('Response:', event.status); console.log('Response:====成功响应的处理============'); }, (error) => { // 错误响应时的处理 console.error('Error:', error.message); console.error('Error', '=======error msg========='); } ) ); } ``` #### 2.3 配置到根模块 在主模块中导入并配置拦截器服务。 ```typescript import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { MyhttpInterceptorServiceService } from './services/myhttp-interceptor-service.service'; @NgModule({ declarations: [ // ... MyhttpInterceptorServiceService, ], imports: [ // ... HttpClientModule, HTTP_INTERCEPTORS, // 引入HTTP拦截器 ], providers: [ { provide: HTTP_INTERCEPTORS, useClass: MyhttpInterceptorServiceService, multi: true, // 设置为true以支持多个拦截器 }, ], bootstrap: [AppComponent], }) export class AppModule {} ``` ### 3. 在组件中使用拦截器 在组件中调用`HttpClient`实例来使用拦截器。 ```typescript import { Component, OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Component({ selector: 'app-student', templateUrl: './student.component.html', styleUrls: ['./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; }); } } ``` ### 4. 测试效果 通过上述步骤配置和使用拦截器后,你可以在组件中访问`student works!

`,并且可以看到从API获取的用户名称。 总之,拦截器是Angular中非常有用的工具,可以帮助你轻松地管理和修改HTTP请求和响应。通过实现自定义的拦截器逻辑,你可以根据需求定制请求和响应的处理方式。

正文

1:为啥要使用拦截器 httpClient 请求响应处理,其作用我们主要是:

目前我的Angular版本是Angular 17.3,版本中实现请求和响应的拦截处理了。这种机制非常适合添加如身份验证头、错误统一处理、日志记录等功能。

======具体的操作步骤=======

2:注入服务:ng g s services/myhttp-interceptorService

 1 import { Injectable } from '@angular/core';
 2 import { HttpResponse, HttpRequest, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http';
 3 import { Observable, tap } from 'rxjs';
 4 
 5 @Injectable({
 6   providedIn: 'root'
 7 })
 8 // 用作http 请求响应的拦截器
 9 export class MyhttpInterceptorServiceService implements HttpInterceptor {
11   constructor() { }
12   intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
13     // 请求前处理,可以加上 head 的token 如果需要
14     //console.log('Request:', req.url);
15     console.log('Request:=======请求前的处理=========' + req.url);
16     if (!req.headers.has('Authorization')) {
17       req = req.clone({
18         setHeaders: {
19           Authorization: 'Bearer ' + localStorage.getItem('logininfo')
20         }
21       });
22       console.log("请求头新增token 成功 Authorization-----------");
23     } else {
24       console.log("已经存在token,不需要新增");
25     }
26     // 发送请求,并且在响应上做文章
27     return next.handle(req).pipe(
28       tap(
29         event => {
30           if (event instanceof HttpResponse) {
31             // 成功响应时的处理
32             //console.log('Response:', event.status);
33             console.log('Response:====成功响应的处理============');
34           }
35         },
36         error => {
37           // 错误响应时的处理
38           //console.error('Error:', error.message);
39           console.error('Error', '=======error msg=========');
40         }
41       )
42     );
43   }
44 }

3:配置到根模块中 app.module.ts

 1 import { NgModule } from '@angular/core';
 2 import { BrowserModule } from '@angular/platform-browser';
 3 
 4 import { AppRoutingModule } from './app-routing.module';
 5 import { AppComponent } from './app.component';
 6 import { HomeComponent } from './components/home/home.component';
 7 import { TopComponent } from './components/top/top.component';
 8 import { MenuComponent } from './components/menu/menu.component';
 9 import { ProductComponent } from './components/product/product.component';
10 
11 
12 //primeng
13 import {ButtonModule} from 'primeng/button';
14 import { FormsModule } from '@angular/forms';
15 import {CalendarModule} from 'primeng/calendar';
16 import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
17 
18 import {PanelMenuModule} from 'primeng/panelmenu';
19 import { BodyComponent } from './components/body/body.component';
20 
21 import {TableModule} from 'primeng/table'
22 import {InputTextModule} from 'primeng/inputtext';
23 import {MessageModule} from 'primeng/message';
24 import {ToastModule} from 'primeng/toast';
25 
26 import { TranslateModule,TranslateLoader } from '@ngx-translate/core';
27 import { HttpClient, HttpClientModule } from '@angular/common/http';
28 import { TranslateHttpLoader } from '@ngx-translate/http-loader';
29 import { MydialogComponent } from './components/mydialog/mydialog.component';
30 import { MybooksComponent } from './components/mybooks/mybooks.component';
31 import { StudentComponent } from './components/student/student.component';
32 import { TeacherComponent } from './components/teacher/teacher.component';
33 import { WelcomeComponent } from './components/welcome/welcome.component';
34 import { LoginComponent } from './components/login/login.component';
35 
36 //HttpClientModule, HTTP_INTERCEPTORS -----拦截器的导入
37 import { HTTP_INTERCEPTORS } from '@angular/common/http';
38 import { MyhttpInterceptorServiceService } from './services/myhttp-interceptor-service.service';
39 
40 export function HttpLoaderFactory(http: HttpClient) {
41   return new TranslateHttpLoader(http,'../assets/i18n/',".json");
42 }
43 @NgModule({
44   declarations: [
45     AppComponent,
46     HomeComponent,
47     TopComponent,
48     MenuComponent,
49     ProductComponent,
50     BodyComponent,
51     MydialogComponent,
52     MybooksComponent,
53     StudentComponent,
54     TeacherComponent,
55     WelcomeComponent,
56     LoginComponent
57   ],
58   imports: [
59     BrowserModule,
60     AppRoutingModule,
62     BrowserAnimationsModule,
64     ButtonModule,
65     FormsModule,
66     CalendarModule,
68     PanelMenuModule,
70     TableModule,
71     InputTextModule,
72     MessageModule,
73     ToastModule,
74 
75 HttpClientModule,TranslateModule.forRoot({
76   loader: {
77     provide: TranslateLoader,
78     useFactory: HttpLoaderFactory,
79     deps: [HttpClient]
80   }
81 })
84   ],
85   providers: [{
86     provide: HTTP_INTERCEPTORS,   //---------------
87     useClass: MyhttpInterceptorServiceService,
88     multi: true   // 注意这里设置为true,因为可以有多个拦截器
89   }],
90   bootstrap: [AppComponent]
91 })
92 export class AppModule { }
//重点如下配置: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,因为可以有多个拦截器 }],

4:在组件中测试使用

 1 <p>student works! 请求接口获取到用户名称为:{{userName}}</p>
 2 
 3 import { Component, OnInit } from '@angular/core';
 4 import { HttpClient } from '@angular/common/http';
 5 import { Injectable } from '@angular/core';
 6 @Component({
 7   selector: 'app-student',
 8   templateUrl: './student.component.html',
 9   styleUrl: './student.component.scss'
10 })
11 export class StudentComponent implements OnInit {
12   userName: string;
13   constructor(private http: HttpClient) {
14     this.userName = "";
15   }
16   ngOnInit(): void {
17     this.http.get('http://www.baidu.com:4200/gateway/basic/accounts/getUserAcountList?ntid=3793831').pipe().subscribe((data?: any) => {
18       console.log(data);
19       this.userName = data.data[0].name;
20     })
21   }
22 }

5:测试效果

 

 

 

 

与Angular项目简单使用拦截器 httpClient 请求响应处理相似的内容:

Angular项目简单使用拦截器 httpClient 请求响应处理

1:为啥要使用拦截器 httpClient 请求响应处理,其作用我们主要是: 目前我的Angular版本是Angular 17.3,版本中实现请求和响应的拦截处理了。这种机制非常适合添加如身份验证头、错误统一处理、日志记录等功能。 具体的操作步骤 2:注入服务:ng g s services/myh

【Dotnet 工具箱】基于 .NET 6 和 Angular 构建项目任务管理平台

1.Reha 时间管理大师 Rhea 是一个基于 C# 和 .NET 6 开发的在线任务管理平台,类似于 禅道、Jira、Redmine, 滴答清单等。 支持多视图多维度统一管理任务。多级结构,工作区,空间,文件夹,列表,可以更灵活的进行任务管理。 应用支持多主题和主题色切换,灵活搭配,随心所欲。

如何在现有的Vue项目中嵌入 Blazor项目?

目前官方只提供了angular和react俩种示例,所以本教程将来讲解如何在Vue的现有项目中使用,上期已经做好了react的教材! 准备流程 Vue 项目创建流程 使用Vue创建一个Demo项目 全部选择默认No即可 然后项目名称就用demo了 npm init vue@latest cd dem

如何实现在react现有项目中嵌入Blazor?

如何实现在react现有项目中嵌入Blazor? 目前官方只提供了angular和react俩种示例所以本教程只讲react教程 思路讲解: 首先在现有react项目中我们可能某些组件是在Blazor中完成,但是我们没办法找到怎么在react中轻量级使用blazor组件,可能会有人会使用iframe

Util 应用框架 UI 全新升级

Util UI 已经开发多年, 并在多家公司的项目使用. 不过一直以来, Util UI 存在一些缺陷, 始终未能解决. 最近几个月, Util 团队下定决心, 终于彻底解决了所有已知缺陷. Util 应用框架 UI 介绍 Util 应用框架 UI 建立在 Angular , Ng-Zorro, N

Redux与前端表格施展“组合拳”,实现大屏展示应用的交互增强

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 Redux 是 JavaScript 状态容器,提供可预测化的状态管理。它可以用在 react、angular、vue 等项目中, 但与 react 配合使用更加方便一

Angular等了三年,那个她已经来了

“在等待其他框架跟上的这三年”,Angular在陆陆续续抛弃之前引以为豪的设计。又由于大量的历史包袱,这些设计变更又做得扭扭捏捏,做不到轻装上阵。

Angular 集成 StreamSaver 大文件下载

应用场景: 实现目标: 在网页端实现大文件(文件大小 >= 2 G) 断点续传 实际方案: 发送多次请求, 每次请求一部分文件数据, 然后通过续写将文件数据全部写入. 难点: 无法实现文件续写, 最后采用 StreamSaver 来解决这个问题. 1. 首先从 git hub 将 StreamSav

Angular cli 组件和服务的创建, 父传子,子传父,服务的简单使用

1:Angular cli 创建组件component ng g component components\right ng g c wave 简写 需要定位到根路径下即可创建组件 Could not find an NgModule. Use the skip-import option to s

angular + express 实现websocket通信

最近需要实现一个功能,后端通过TCP协议连接雷达硬件的控制器,前端通过websocket连接后端,当控制器触发消息的时候,把信息通知给所以前端; 第一个思路是单独写一个后端服务用来实现websocket,调试成功了,后来又发现一个插件express-ws,于是决定改变思路,研究了下,最终代码如下,希