一、引言:

        拦截器顾名思义就是对请求的拦截,分别为请求拦截器响应拦截器, 执行顺序: 请求拦截器 -> api请求 -> 响应拦截器axios实现这个拦截器机制如下:

        不难发现, 这其实就是一个顺序链表能实现的,把请求拦截器的函数推在前面, api请求的核心方法放在中间, 响应拦截器放在数组后面,遍历执行链表就实现了拦截器的顺序执行过程。

二、拦截器的作用

        a. 统计api从发起请求到返回数据需要的时间

        b. 配置公共的请求头,加载弹窗等

        c. 对响应状态码做拦截,比入后端返回400或500的状态码, 返回对应错误信息

三、拦截器的实现

        一般来说请求和响应拦截器会同时配置:

        0. 引入axios模块,并创建实例

import axios from "axios";

const axios = axios.create({
  timeout: 3000,
  withCredentials: true
})

        1. 请求拦截器

                在请求发送前统一执行某些操作,常用在请求头中处理token等        

axios.interceptors.request.use(
  (config) => {  
    Indicator.open({  //加载提示框
        text: '加载中...',
        spinnerType: 'fading-circle'
      });

    if (localStorage.token) {
      config.headers["Authorization"] = "Bearer " + localStorage.token;
    }
    return config;
  },
  (err) => {
    return Promise.reject(err);
  }
);

        2. 响应拦截器

axios.interceptors.response.use(
  (config) => {
    Indicator.close();  //关闭加载框
    return config;
  },
  (e) => {
	    // 401-未经过认证,没有提供身份验证或身份验证失败(一般是token cookie 失效),403 - 被禁止,该身份没有权限
    if (e.response?.status === 401) {
      window.location.reload();
      return Promise.reject("rmp.vehicle.permissionLost");
    }
    if (e.response?.status === 403) {
      return Promise.reject("rmp.vehicle.Nopermission");
    }
    if (e.response.status >= 500) {
      return Promise.reject("serverError");
    }
    return Promise.reject(e);
  }
);

export default axios;

四、总结

    axios 把用户注册的每个拦截器构造成一个 promise.then 所接受的参数,把相对应的拦截器数组进行调用链的头部和尾部组装,在运行时把所有的拦截器按照一个 promise 链的形式以此执行。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐