当前位置 : 主页 > 网络编程 > JavaScript >

axios请求的一些常见操作实战指南

来源:互联网 收集:自由互联 发布时间:2023-02-08
目录 axios封装请求 axios封装常见操作 axios的二次封装 axios的取消重复请求 axios的错误重复请求 token失效返回登录页面 总结 axios封装请求 axios封装常见操作 axios请求时的常见或者说是常用
目录
  • axios封装请求
    • axios封装常见操作
      • axios的二次封装
      • axios的取消重复请求
      • axios的错误重复请求
      • token失效返回登录页面
  • 总结

    axios封装请求

    axios封装常见操作

    axios请求时的常见或者说是常用的操作,需要对常规的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的取消重复请求

    我们拿二次封装后的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失效返回登录页面

    token失效返回登录页的原理呢就是在进行axios请求时,对需要拼接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);
      }
    );

    总结

    到此这篇关于axios请求的一些常见操作的文章就介绍到这了,更多相关axios请求操作内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

    网友评论