axios请求操作
翜煜 人气:0axios封装请求
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); } );
总结
加载全部内容