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

作者:翜煜 时间:2023-07-02 16:33:25 

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);
 }
);

来源:https://juejin.cn/post/7144242499391848462

标签:axios,请求,封装
0
投稿

猜你喜欢

  • 在Python的web框架中编写创建日志的程序的教程

    2021-11-25 05:14:07
  • win7+Python3.5下scrapy的安装方法

    2023-06-05 02:02:41
  • Java游戏服务器之数据库表存取封装

    2024-01-13 13:08:17
  • vue、react等单页面项目部署到服务器的方法及vue和react的区别

    2024-04-30 10:30:00
  • Mysql 执行一条语句的整个过程详细

    2024-01-19 08:53:08
  • Django使用channels + websocket打造在线聊天室

    2022-01-05 11:16:26
  • django生产环境搭建(uWSGI+django+nginx+python+MySQL)

    2024-01-26 03:27:48
  • python设置环境变量的作用和实例

    2021-07-03 05:03:17
  • 多种语言下获取当前页完整URL及其参数

    2022-02-28 23:23:29
  • Golang 实现复制文件夹同时复制文件

    2024-02-09 10:57:26
  • Mysql Error Code : 1436 Thread stack overrun

    2024-01-23 14:04:04
  • Go语言Web编程实现Get和Post请求发送与解析的方法详解

    2024-05-09 14:52:25
  • 常用python爬虫库介绍与简要说明

    2023-01-07 13:09:12
  • DNS优化的原理和方法

    2012-04-26 16:43:56
  • Pandas —— resample()重采样和asfreq()频度转换方式

    2023-12-10 16:51:09
  • python实现简单飞行棋

    2021-07-24 23:02:14
  • 详解Tensorflow数据读取有三种方式(next_batch)

    2023-08-10 07:30:42
  • 用python批量移动文件

    2022-12-21 10:48:43
  • mysql千万级数据量根据索引优化查询速度的实现

    2024-01-21 19:16:31
  • 在Centos 5.5 上编译安装mysql 5.5.9

    2024-01-19 02:56:39
  • asp之家 网络编程 m.aspxhome.com