axios拦截器工作方式及原理源码解析

axios拦截器工作方式及原理源码解析

什么是拦截器

在介绍拦截器的工作方式及原理源码解析之前,我们首先需要了解什么是拦截器。

在axios中,拦截器分为请求拦截器响应拦截器,它们分别对发出的请求和返回的响应进行拦截处理。

请求拦截器

请求拦截器允许我们在请求被发送之前对其进行处理,这包括检查请求配置、转换请求数据等操作。

axios.interceptors.request.use(function (config) {
  // 在发送请求之前对请求进行处理
  return config;
}, function (error) {
  // 当请求出错的时候执行的操作
  return Promise.reject(error);
});

在上面的代码中,我们使用了axios.interceptors.request.use方法注册了一个请求拦截器。它的第一个参数是一个函数,它会在发送请求之前被调用,参数config是请求的配置对象,我们可以在这里对请求进行处理。

拦截器可以被多次注册,它们会按照注册的顺序依次执行。因此,如果我们需要多次处理请求,可以注册多个拦截器。

响应拦截器

响应拦截器允许我们在请求响应之后对其进行处理,这包括检查响应状态、转换响应数据等操作。

axios.interceptors.response.use(function (response) {
  // 对响应的数据进行处理
  return response;
}, function (error) {
  // 当响应出错的时候执行的操作
  return Promise.reject(error);
});

在上面的代码中,我们使用了axios.interceptors.response.use方法注册了一个响应拦截器。它的第一个参数也是一个函数,它会在接收到响应之后被调用,参数response是响应对象,我们可以在这里对响应进行处理。

同样的,响应拦截器也可以被多次注册,它们会按照注册的顺序依次执行。

源码解析

了解了拦截器的基本概念后,我们现在来看一下axios是如何实现拦截器的。

在axios中,发送请求的方法是axios.request,我们可以查看这个方法的源码来了解拦截器的实现原理。

  function wrap(fn) {
    return function wrapLogic(config) {
      // 在发送请求之前依次执行请求拦截器
      for (var i = 0; i < interceptors.request.length; i++) {
        config = interceptors.request[i](config);
      }
      // 发送请求
      var promise = fn(config);
      // 在响应到达之后依次执行响应拦截器
      for (var i = 0; i < interceptors.response.length; i++) {
        promise = promise.then(interceptors.response[i], interceptors.response[i]);
      }
      return promise;
    };
  }

在上面的源码中,定义了一个wrap函数,这个函数返回了一个新的函数wrapLogic,这个新的函数就是我们实际上调用的方法。

wrapLogic函数中,我们先依次执行了请求拦截器,在发送请求之前处理请求。在请求被发送之后,我们调用fn函数发送请求,fn函数返回的是一个Promise对象,它会等待请求的响应到达。

当响应到达之后,我们再依次执行响应拦截器,对响应进行处理。最后,我们返回Promise对象,供调用方使用。

示例说明

请求拦截器示例

在某个应用中,我们需要在每个请求中添加一个Token,用于身份验证。

我们可以在请求拦截器中添加一个Authorization请求头,并将Token作为值传入,代码如下:

axios.interceptors.request.use(function (config) {
  config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
  return config;
}, function (error) {
  return Promise.reject(error);
});

在上面的代码中,我们通过localStorage获取Token的值,并将其添加到Authorization请求头中。

响应拦截器示例

在某个应用中,我们请求的数据都是JSON格式的,但是在有些情况下,服务器会返回一个非JSON格式的响应,例如一个错误页面。

我们可以在响应拦截器中检查响应的Content-Type类型,如果不是JSON类型,我们就返回一个错误,示例代码如下:

axios.interceptors.response.use(function (response) {
  if (response.headers['content-type'] !== 'application/json') {
    return Promise.reject(new Error('Invalid response content type'));
  }
  return response;
}, function (error) {
  return Promise.reject(error);
});

在上面的代码中,我们检查了响应的Content-Type头,如果不是application/json,我们就返回一个错误。反之,我们返回响应对象,让调用方继续处理响应。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:axios拦截器工作方式及原理源码解析 - Python技术站

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

相关文章

  • 对vue里函数的调用顺序介绍

    接下来我会详细讲解“对vue里函数的调用顺序介绍”的完整攻略。 1. Vue函数的调用顺序 Vue中的函数调用顺序有如下几种情况: beforeCreate(创建前): 这个阶段会在Vue实例初始化之后,数据观测之前被调用。在此阶段,我们无法访问到 data、computed、methods、watch中的任何属性。 created(创建后): 该阶段在实例…

    Vue 2023年5月28日
    00
  • uniapp自定义弹框的方法

    下面我将详细讲解uniapp自定义弹框的方法。 1. 弹框组件编写 在uniapp项目中,我们可以自定义一个弹框组件,以实现自定义弹框的效果。首先,在components目录下创建一个名为customDialog的组件文件夹,然后将该组件注册到全局: // 在main.js中注册 import customDialog from ‘@/components/…

    Vue 2023年5月28日
    00
  • spring boot读取Excel操作示例

    Spring Boot读取Excel操作示例 对于Java开发人员来说,我们通常需要读取Excel文件中的数据来进行数据处理或导入到数据库中。在Spring Boot中,我们可以使用Apache POI库来实现读取Excel文件的操作。 步骤1:添加Apache POI依赖 在pom.xml文件中添加以下依赖: <dependency> <…

    Vue 2023年5月28日
    00
  • vue如何加载本地json数据

    加载本地的JSON数据通常有两种方法: 方法一:通过ajax方式 1.首先,在Vue.js工程的目录下建立一个data目录,将要加载的 JSON 文件复制到这个目录下。 2.在组件中,使用ajax工具去请求这个文件,并在回调函数中将请求到的数据赋值给组件的数据变量。我们可以在组件的生命周期的某个时刻(如created)中调用这个ajax请求。 <tem…

    Vue 2023年5月28日
    00
  • vscode 插件开发 + vue的操作方法

    Vscode 插件开发 + Vue 操作方法 在本文中,我们将介绍如何使用 VSCode 开发插件,并在插件中使用 Vue。 环境要求 在开始使用 Vue 进行开发之前,我们需要先安装好以下环境: Node.js Visual Studio Code Vue CLI 如果您的电脑上还没有这些环境,请先安装好它们。 创建一个 VSCode 插件项目 使用以下命…

    Vue 2023年5月28日
    00
  • vue实现换肤功能

    实现vue的换肤功能通常有两种方式,一种是使用CSS变量(CSS variables),另一种是使用动态加载CSS文件。以下将详细解释这两种实现方式。 使用CSS变量 CSS变量是CSS3新增的特性,定义在:root伪类下,可以通过var()函数在相关的CSS样式中使用。在切换主题时,只需将:root中CSS变量的属性值修改为新主题的对应颜色值即可。 下面是…

    Vue 2023年5月27日
    00
  • vue中mock数据,模拟后台接口实例

    下面我将为您详细讲解如何在Vue中mock数据并模拟后台接口的完整攻略,包含以下流程: 安装mockjs库 配置mock数据 模拟接口请求 首先,我们需要在Vue项目中安装mockjs库,使用npm进行安装: npm install mockjs –save-dev 接着,在项目中创建一个mock文件夹,用于存放mock数据。在mock文件夹中新建一个in…

    Vue 2023年5月28日
    00
  • vue.js页面加载执行created,mounted的先后顺序说明

    在Vue.js中,组件的生命周期包括如下几个阶段:创建(creation)、挂载(mounting)、更新(updating)和销毁(destroying)。其中,created和mounted属于创建和挂载阶段,下面详细介绍它们执行的先后顺序。 首先,created钩子函数会在组件实例创建之后立即被调用,此时模板还未渲染成html,因此无法访问到DOM元素…

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