Angular中的interceptors拦截器

yizhihongxing

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中computed(计算属性)和watch(监听属性)的用法及区别说明

    下面是关于“Vue中computed(计算属性)和watch(监听属性)的用法及区别说明”的完整攻略。 1. computed(计算属性) computed是一种在Vue中用于计算属性的方法,它一般用于需要进行复杂计算的场景。computed其实是一个类似于getter/setter的方法,当它所依赖的值发生改变时,它才会重新计算。 computed示例代码…

    Vue 2023年5月28日
    00
  • Vue中如何使用mock模拟数据

    下面我会为您详细讲解在Vue中如何使用mock模拟数据的完整攻略。 1. 什么是Mock Mock(模拟数据)是指在前端开发中,由于后端接口还未开发完成,前端开发需要提前模拟数据进行开发的一种手段。mock可以在前端使用虚拟数据进行开发,便于前端更好地进行模块开发、调试、测试等。 2. 如何使用mock 2.1 安装mockjs 我们可以使用npm安装moc…

    Vue 2023年5月28日
    00
  • 谈谈vue中mixin的一点理解

    下面是对 “谈谈vue中mixin的一点理解” 的详细讲解: 什么是mixin 在Vue中,mixin指的是混入,也就是将一些可复用的代码,抽象出来,在多个组件之间进行共享。可以理解为抽象出来的一些特性集合。mixin可以包含组件中的各种选项,并且最终会和组件选项合并,优先级高于组件选项。 如何使用mixin 在Vue中使用mixin非常简单。我们可以先定义…

    Vue 2023年5月29日
    00
  • 浅谈vue+webpack项目调试方法步骤

    下面我会详细讲解“浅谈vue+webpack项目调试方法步骤”的完整攻略,包含两个示例说明: 1. 前言 在开发 Vue.js 项目的过程中,使用 webpack 打包工具的情况非常普遍。然而,当我们要进行项目调试时,可能会遇到很多问题,例如如何设置断点,如何在浏览器中查看 console 输出等。本文旨在分享一些使用 Vue.js 与 webpack 进行…

    Vue 2023年5月27日
    00
  • 简单了解Vue computed属性及watch区别

    下面就是“简单了解Vue computed属性及watch区别”的完整攻略。 一、computed属性 在Vue中,computed属性是一个带有缓存的计算属性,也就是说,computed属性只会在它依赖的数据发生变化时才会重新计算一次,否则会直接返回之前缓存的结果。 1.1 定义computed属性 computed属性的定义类似于Vue的数据属性,你可以…

    Vue 2023年5月28日
    00
  • Vue事件的基本操作你知道吗

    当我们使用Vue构建应用程序时,事件处理是至关重要的一部分。Vue提供了许多内置的指令和事件,可以让我们轻松地处理用户操作并响应状态变化。在本篇攻略中,我们将深入探讨Vue中事件的基本操作,同时提供一些示例说明,帮助读者更好地理解。 Vue事件概述 在Vue中,我们可以使用v-on指令来监听DOM事件。该指令可以添加到任何可以触发事件的HTML元素上,例如按…

    Vue 2023年5月27日
    00
  • Vue-cli3中使用TS语法示例代码

    使用Vue-cli3中使用TS语法需要进行以下步骤: 创建Vue-cli3项目 使用Vue-cli3创建项目需要先安装Vue-cli3,安装命令为: npm install -g @vue/cli 创建项目的命令为: vue create my-project 其中my-project是你要创建的项目名称。 安装TypeScript 在创建好的Vue-cli…

    Vue 2023年5月28日
    00
  • Vue父子组件之间事件通信示例解析

    Vue父子组件之间事件通信示例解析 在Vue组件化开发中,父子组件之间需要进行信息传递和交互。Vue提供了通过事件(Event)进行父子组件之间通信的方法。本文将详细探讨Vue父子组件之间事件通信的原理和实现。 父组件向子组件传递数据 可以通过在父组件模板中,使用子组件标签的属性将数据传递给子组件,然后在子组件中通过“props”属性接受父组件传递的数据。此…

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