Angular中的interceptors拦截器

Angular是一个流行的JavaScript框架,该框架为Web应用程序提供了一个良好的基础。Interceptors 是 Angular 提供的拦截器机制。这个机制允许你拦截 HTTP 请求和响应,做一些访问控制和业务逻辑的处理并将它们传递到下一个拦截器或请求中,提供了一种简单但强大的方式来创建一个可重用的 HTTP 拦截器。

拦截器的基本结构和用法

拦截器通过实现 HttpInterceptor 接口来创建。该接口定义了两个方法:

  1. intercept(HttpRequest,next):拦截HTTP 请求并处理传递给它的响应。返回一个可观察的HTTP响应过程。
  2. HttpHandler:实现了 handle(HttpRequest) 方法,它处理HTTP请求并返回可观察的响应对象。

以下是一个例子,展示了如何实现一个拦截器:

import {Injectable} from '@angular/core';
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';
import {Observable} from 'rxjs';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const token = localStorage.getItem('access_token');
        request = request.clone({
            setHeaders: {
                Authorization: `Bearer ${token}`
            }
        });
        return next.handle(request);
    }
}

在上面的例子中,AuthInterceptor 拦截器处理了请求,然后向请求头部添加了一个 Authorization 字段,来存放从本地存储中获取到的 access_token 的值。最后,处理被传递到下一个拦截器或请求中。

拦截器的使用示例

为了实现一个完整的拦截器示例,我们需要了解下面的两个场景:

  1. 每个发出的 HTTP 请求应该会先经过一个日志拦截器,然后才能被服务器处理。
  2. 服务端返回 HTTP 响应后,它应该跨域传递给客户端的每个响应都应该经过一个处理器。

下面三个示例分别展示了如何实现上述两个场景下的拦截器:

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';

@Injectable()
export class LoggingInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const started = Date.now();
    return next.handle(req).pipe(
      tap(event => {
        const elapsed = Date.now() - started;
        const message = `Request for ${req.urlWithParams} took ${elapsed} ms.`;
        console.log(message);
      })
    );
  }
}

在这个例子中,LoggingInterceptor 拦截器记录了每个请求的开始时间,并在每个请求结束时计算它所花费的时间。然后,将所记录的日志记入控制台。

另一个例子,展示了如何在 HTTP 响应后处理跨域请求:

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpHandler, HttpRequest, HttpResponse, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { finalize, tap } from 'rxjs/operators';

@Injectable()
export class TimingInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const started = Date.now();

    return next.handle(req).pipe(
      tap(
        event => {
          if (event instanceof HttpResponse) {
            const elapsed = Date.now() - started;
            console.log(`Request for ${req.urlWithParams} took ${elapsed} ms.`);
          }
        },
        error => console.error(error)
      ),
      finalize(() => {
        const elapsed = Date.now() - started;
        console.log(`Request for ${req.urlWithParams} took ${elapsed} ms.`);
      })
    );
  }
}

这个例子中,TimingInterceptor 拦截器在 HTTP 响应返回之前捕获了请求,并记录了请求的开始时间,然后在响应返回之后记录该请求所花费的时间。

以上是关于 Angular 中拦截器使用的攻略及示例说明,希望能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Angular中的interceptors拦截器 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • VUE 动态组件的应用案例分析

    下面是关于“VUE 动态组件的应用案例分析”的完整攻略。 什么是 Vue 动态组件 Vue 动态组件是 Vue 中非常强大的功能之一。它可以帮助我们在应用中实现按需加载和渲染组件的功能。 动态组件可以让我们在一个地方注入特定组件的模板和逻辑,可以根据需要在不同的页面上重复使用。 在 Vue 中,我们使用 动态组件 标签来实现动态加载和渲染组件的功能,它的语法…

    Vue 2023年5月27日
    00
  • vue3.0-props、computed、自定义事件方式

    我来为您详细讲解一下关于Vue 3.0中的props、computed和自定义事件的使用方法。 Vue 3.0 – Props Props是Vue中用于向子组件传递数据的一种方式。用法如下: 在父组件中,通过在子组件的标签上使用属性(props),向子组件传递数据: <template> <div> <child-compone…

    Vue 2023年5月28日
    00
  • 深入理解Vue的数据响应式

    深入理解Vue的数据响应式 在Vue中,数据响应式是其最为核心的设计之一。本文将深入探讨Vue的响应式原理,并提供一些示例帮助你更好的理解数据响应式。 响应式原理简介 Vue通过给数据添加getter和setter来实现数据响应式。当数据发生改变时,它会通知所有使用该数据的组件进行重新渲染。下面是响应式原理的伪代码示例: function defineRea…

    Vue 2023年5月28日
    00
  • Vue echarts画甘特图流程详细讲解

    下面我将详细讲解“Vue echarts画甘特图流程详细讲解”的完整攻略。 1. 甘特图简介 甘特图是一种常用于项目管理的图表类型,用于展示任务的时间轴,显示各个任务的开始时间、结束时间和持续时间。它能够清晰地展示每个任务的进展情况,帮助团队掌握项目进展,及时协调、调整工作计划和资源分配。 2. 准备工作 在使用 Vue 和 echarts 画甘特图之前,我…

    Vue 2023年5月29日
    00
  • vue中使用 pako.js 解密 gzip加密字符串的方法

    下面是详细讲解vue中使用pako.js解密gzip加密字符串的方法的完整攻略: 准备工作 引入pako.js库 确定gzip加密字符串的编码方式 解密过程 将gzip加密字符串进行base64解码转化成一个UInt8Array类型的数组 let str = "H4sIAAAAAAAAAKvLy0zJzcy00ElVQJDmFhYWFgYGBlJY…

    Vue 2023年5月27日
    00
  • Vue3使用路由及配置vite.alias简化导入写法的过程详解

    下面就来详细讲解一下“Vue3使用路由及配置vite.alias简化导入写法的过程详解”。 一、前置准备 在开始使用路由及配置vite.alias之前,需要先安装Vue3及Vue Router。使用命令行工具安装: npm install vue@next vue-router@4 –save 同时,还需要使用Vite作为打包工具。同样使用命令行工具安装:…

    Vue 2023年5月28日
    00
  • VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法

    如果您想在VSCode中快速地生成.vue文件的模板代码,可以使用Vue VSCode Snippets插件。这个插件提供了一系列可以用于在Vue项目中快速生成模板代码的人性化代码片段,例如template、script等。不仅如此,这个插件还支持自定义模板,您可以修改定义对于其他模板的方法,以实现更加高效的开发。 下面是详细的操作过程: 安装Vue VSC…

    Vue 2023年5月28日
    00
  • bootstrap datetimepicker控件位置异常的解决方法

    下面是关于“bootstrap datetimepicker控件位置异常的解决方法”的完整攻略。 前言 datetimepicker是基于bootstrap库的一个控件,用于方便地选择日期和时间。在使用过程中,我们经常会遇到控件位置异常的情况,这时候该怎么办呢?下面我们就来一步一步解决这个问题。 步骤 第一步:检查样式表 datetimepicker的样式表…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部