axios请求的一些常见操作实战指南
作者:翜煜 发布时间:2023-07-02 16:33:25
标签:axios,请求,封装
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


猜你喜欢
- 前言: 在各类技术岗位面试中,似乎 MySQL 相关问题经常被问到。无论你面试开发岗位或运维岗位,总会问几道数据库问题。经常有小伙
- /**//// <summary> /// 生成带CDATA的节点 /// </summary> /// <p
- 本文实例为大家分享了python实现自动下载sftp文件的具体代码,供大家参考,具体内容如下实现功能:利用python自动连接sftp,并下
- 一、问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统
- 1,前端样式2,html代码{% load asset_filter %}<div class="col-sm-2"
- 垃圾评论,垃圾留言,人见人憎,用了验证码,效果也好不到哪里去,还影响用户体验。有的网站甚至不惜牺牲用户体验,而构造强悍的惨不忍睹的超级验证码
- 下面看下通过Pyinstaller打包Pygame库写的小游戏程序出现的问题解决方法# -基于Python的Pygame库的GUI游戏游戏内
- Python中的闭包的概念, 在我看来, 就相当于在某个函数中又定义了一个或多个函数, 内层函数定义了具体的实现方式, 而外层返回的就是这个
- JavaScript本身作为一门简单的语言,就其变量作用域问题一样令不少人头晕,这主要是因为JavaScript闭包的存在。本文不打算深入讲
- 在我们做搜索的时候经常要用到模糊查询 (注:其中name1,name2,name3,name4为数据库字段) 1.方法 sql="
- 我就废话不多说了,直接上代码吧!#Python的matrix转置matrix = [[1,2,3,4],[5,6,7,8],[9,10,11
- 应该是开心网(kaixin.com)的宠物功能又升级了,这几次发来的邮件内容不仅不能让我开心,反而让我觉得很恶心。开心网注册也一段时间了,之
- 了解如何在sublime编辑器中安装python软件包,以实现自动完成等功能,并在sublime编辑器本身中运行build。安装Sublim
- 很简单的一个函数,就是根据当前的日期生成一个随机数。<% Function getRnd() '**********
- 安装pip install requests发送网络请求import requestsr=requests.get('http://
- 如何发送一个XMLHttpRequest的检索的特定部分HTML标题数据。<html> <head> <tit
- 下载小姐姐图片并保存请求的地址伪装定位元素下载图片保存好了下面开始我们的实战,这个是我们今天访问的url:url = 'http:/
- 我们知道,数组的sort方法可以对数组元素进行排序,默认是按ASCII字母表顺序排序。如果要根据其他的顺序排序就需要为sort方法提供一个比
- Python-类属性,实例属性,类方法,静态方法,实例方法类属性和实例属性#coding:utf-8class Student(object
- 今天遇到一个非常基础的问题,结果搞了好久好久.....赶快写一篇博客记录一下:本来两个不一样的字符串,在if 的条件判断中被判定为True,