目录axiOS封装请求axios封装常见操作axios的二次封装axios的取消重复请求axios的错误重复请求token失效返回登录页面总结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请求来完成取消重复请求
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);
}
);
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请求时,对需要拼接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请求操作内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: axios请求的一些常见操作实战指南
本文链接: https://lsjlt.com/news/167792.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0