axios二次封装

204 阅读3分钟

axios封装请求

axios二次封装

//我们在做axios封装时,我们引入axios
import axios from 'axios'
//请求拦截器和响应式拦截器就是直接axios.跟上拦截器
axios.interceptors.request.use( 
    function (config) { 
    // 在发送请求之前做些什么
        return config;
    }, 
    function (error) {
    // 对请求错误做些什么 
        return Promise.reject(error); 
    } 
); 
// 添加响应拦截器 
axios.interceptors.response.use(
    function (response) { 
        // 2xx 范围内的状态码都会触发该函数。
        // 对响应数据做点什么
        const { data } = response;
        return data; 
    }, 
    function (error) { 
        // 超出 2xx 范围的状态码都会触发该函数。
        // 对响应错误做点什么
        return Promise.reject(error);
    } 
);

//二次封装是因为项目业务根据不同的功能模块划分为不同的 url 前缀等等,
//我们就可以根据功能模块配置不同的 axios 配置。
import axios from "axios";
const http = axios.create({ 
    baseURL: process.env.VUE_APP_BASE_URL, 
}); 
// 添加请求拦截器 
http.interceptors.request.use(
    function (config) {
        // 在发送请求之前做些什么
        return config;
    },
    function (error) {
        // 对请求错误做些什么
        return Promise.reject(error); 
    } 
);
// 添加响应拦截器 
http.interceptors.response.use( 
    function (response) { 
        // 2xx 范围内的状态码都会触发该函数。
        // 对响应数据做点什么
        const { data } = response; return data;
    },
    function (error) { 
        // 超出 2xx 范围的状态码都会触发该函数。 
        // 对响应错误做点什么 
        return Promise.reject(error);
    }
);

axios的取消重复请求

import axios from "axios";
const http = axios.create({
baseURL: process.env.VUE_APP_BASE_URL,//公共路径
});
//取消请求 
let httplist = [] 
const removeHttp = config => { 
    let index = httplist.findIndex(v => v.url === config.url && v.method === config.method)
    if (index >= 0) { 
        //取消请求
        httplist[index].controller.abort() 
        //删除当前数据
        httplist.splice(index, 1) 
        } 
      } 
http.interceptors.request.use(
    function (config) { 
        removeHttp(config) 
        //取消操作
        //在push之前遍历数组找到相同的请求取消掉 
        const controller = new AbortController() 
        config.signal = controller.signal //用来取消操作的key 
        config.controller = controller //将控制器绑定到每个请求身上
        httplist.push({ ...config }) //每次的请求加入到数组 
        return config
    },
    function (error) {
        // 对请求错误做些什么
        return Promise.reject(error) 
    } 
) 
// 添加响应拦截器
http.interceptors.response.use( 
    function (response) { 
        // 2xx 范围内的状态码都会触发该函数。
        // 对响应数据做点什么 
        const { data } = response;
        return data;
    }, 
    function (error) { 
        // 超出 2xx 范围的状态码都会触发该函数。
        // 对响应错误做点什么
        return Promise.reject(error);
    } 
);

axios的错误重复请求

http.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config; 
    // 如果配置不存在或未设置重试选项,则拒绝 
    if (!config || !config.retry) return Promise.reject(err);
    // 设置变量以跟踪重试次数 
    config.__retryCount = config.__retryCount || 0; 
    // 判断是否超过总重试次数
    if (config.__retryCount >= config.retry) {
    // 返回错误并退出自动重试
    return Promise.reject(err); 
    } 
    // 增加重试次数 
    config.__retryCount += 1; //打印当前重试次数
    console.log(config.url + " 自动重试第" + config.__retryCount + "次"); 
    // 创建新的Promise
    var backoff = new Promise( function (resolve) { 
        setTimeout(function () { 
            resolve(); 
        }, config.retryDelay || 1); 
    });
   // 返回重试请求
   return backoff.then(function () {
     return axios(config); 
   });               
});        

token失效返回登录页面

//我们在做axios封装时,我们引入axios
import axios from 'axios' 
//请求拦截器和响应式拦截器就是直接axios.跟上拦截器
//声明一个数组,相当于一个白名单
const whiteList=[ '/login', '/code' ] 
//放入不需要拼接token的接口 
axios.interceptors.request.use( 
    function (config) { 
      // 在发送请求之前做些什么
      return config; 
    },
    function (error) {
      // 对请求错误做些什么 
      return Promise.reject(error); 
    } 
); 
// 添加响应拦截器 
axios.interceptors.response.use(
    function (response) {
      if(whiteList.includes(response.config.url)){ 
       //如果白名单中包含请求的接口不做任何操作
      }else{
        //反之判断返回的数据中的code或是status
        if(response.data.code===401) 
        //我这边token失效返回的是401 
        sessionStorage.removeItem('token')
        //清空存储的token值 
        window.location('/login') 
        //跳转登录页
      } 
      // 2xx 范围内的状态码都会触发该函数。 
      // 对响应数据做点什么
      const { data } = response;
      return data; 
    }, 
    function (error) { 
      // 超出 2xx 范围的状态码都会触发该函数。
      // 对响应错误做点什么
      return Promise.reject(error);
    } 
);