Angular项目如何使用拦截器 httpClient 请求响应处理

 更新时间:2024年06月19日 09:31:06   作者:天天向上518  
这篇文章主要介绍了Angular项目简单使用拦截器httpClient请求响应处理,目前我的Angular版本是Angular 17.3,版本中实现请求和响应的拦截处理了,这种机制非常适合添加如身份验证头、错误统一处理、日志记录等功能,需要的朋友可以参考下

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

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

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

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

 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<any>, next: HttpHandler): Observable<HttpEvent<any>> {
     // 请求前处理,可以加上 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=========');
         }
       )
     );
   }
 }

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

 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 { }
//重点如下配置: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:在组件中测试使用

<p>student works! 请求接口获取到用户名称为:{{userName}}</p>
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;
    })
  }
}

5:测试效果

到此这篇关于Angular项目简单使用拦截器 httpClient 请求响应处理的文章就介绍到这了,更多相关Angular拦截器 httpClient内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ionic3实战教程之随机布局瀑布流的实现方法

    ionic3实战教程之随机布局瀑布流的实现方法

    这篇文章主要给大家介绍了关于ionic3实战教程之随机布局瀑布流的实现方法,文中通过示例代码和图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • 深入浅析AngularJS中的一次性数据绑定 (bindonce)

    深入浅析AngularJS中的一次性数据绑定 (bindonce)

    这篇文章主要介绍了AngularJS中的一次性数据绑定 (bindonce)知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • Angular.js自动化测试之protractor详解

    Angular.js自动化测试之protractor详解

    Protractor是一个建立在WebDriverJS基础上的端到端(E2E)的AngularJS JavaScript Web应用程序测试框架,下面这篇文章主要给大家介绍了angular.js自动化测试之protractor的相关资料,需要的朋友可以参考下。
    2017-07-07
  • Angular刷新当前页面的实现方法

    Angular刷新当前页面的实现方法

    这篇文章主要介绍了Angular刷新当前页面的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • angular中子控制器向父控制器传值的实例

    angular中子控制器向父控制器传值的实例

    今天小编就为大家分享一篇angular中子控制器向父控制器传值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • angular动态表单制作

    angular动态表单制作

    通过实例代码给大家详细讲述了angular动态表单的制作方法,对此有需要的朋友参考下。
    2018-02-02
  • 利用Angularjs实现幻灯片效果

    利用Angularjs实现幻灯片效果

    AngularJS是Google开发的纯客户端JavaScript技术的WEB框架,用于扩展、增强HTML功能,它专为构建强大的WEB应用而设计。下面这篇文章我们来分享如何利用Angularjs实现幻灯片效果。
    2016-09-09
  • angularjs下ng-repeat点击元素改变样式的实现方法

    angularjs下ng-repeat点击元素改变样式的实现方法

    今天小编就为大家分享一篇angularjs下ng-repeat点击元素改变样式的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 利用Angular2 + Ionic3开发IOS应用实例教程

    利用Angular2 + Ionic3开发IOS应用实例教程

    这篇文章主要给大家介绍了关于利用Angular2 + Ionic3开发IOS应用的相关资料,文中通过示例代码和图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • angularjs 缓存的使用详解

    angularjs 缓存的使用详解

    这篇文章主要介绍了angularjs 缓存的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论