axios請(qǐng)求的一些常見操作實(shí)戰(zhàn)指南
axios封裝請(qǐng)求
axios封裝常見操作
axios請(qǐng)求時(shí)的常見或者說是常用的操作,需要對(duì)常規(guī)的axios封裝做出改變根據(jù)不同條件寫出不同的效果
axios的二次封裝
//我們?cè)谧鯽xios封裝時(shí),我們引入axios import axios from 'axios' //請(qǐng)求攔截器和響應(yīng)式攔截器就是直接axios.跟上攔截器 axios.interceptors.request.use( function (config) { // 在發(fā)送請(qǐng)求之前做些什么 return config; }, function (error) { // 對(duì)請(qǐng)求錯(cuò)誤做些什么 return Promise.reject(error); } ); // 添加響應(yīng)攔截器 axios.interceptors.response.use( function (response) { // 2xx 范圍內(nèi)的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么 const { data } = response; return data; }, function (error) { // 超出 2xx 范圍的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么 return Promise.reject(error); } );
//二次封裝是因?yàn)轫?xiàng)目業(yè)務(wù)根據(jù)不同的功能模塊劃分為不同的 url 前綴等等, //我們就可以根據(jù)功能模塊配置不同的 axios 配置。 import axios from "axios"; const http = axios.create({ baseURL: process.env.VUE_APP_BASE_URL, }); // 添加請(qǐng)求攔截器 http.interceptors.request.use( function (config) { // 在發(fā)送請(qǐng)求之前做些什么 return config; }, function (error) { // 對(duì)請(qǐng)求錯(cuò)誤做些什么 return Promise.reject(error); } ); // 添加響應(yīng)攔截器 http.interceptors.response.use( function (response) { // 2xx 范圍內(nèi)的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么 const { data } = response; return data; }, function (error) { // 超出 2xx 范圍的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么 return Promise.reject(error); } );
axios的取消重復(fù)請(qǐng)求
我們拿二次封裝后的axios請(qǐng)求來完成取消重復(fù)請(qǐng)求
import axios from "axios"; const http = axios.create({ baseURL: process.env.VUE_APP_BASE_URL,//公共路徑 }); //取消請(qǐng)求 let httplist = [] const removeHttp = config => { let index = httplist.findIndex(v => v.url === config.url && v.method === config.method) if (index >= 0) { //取消請(qǐng)求 httplist[index].controller.abort() //刪除當(dāng)前數(shù)據(jù) httplist.splice(index, 1) } } http.interceptors.request.use( function (config) { removeHttp(config) //取消操作 //在push之前遍歷數(shù)組找到相同的請(qǐng)求取消掉 const controller = new AbortController() config.signal = controller.signal //用來取消操作的key config.controller = controller //將控制器綁定到每個(gè)請(qǐng)求身上 httplist.push({ ...config }) //每次的請(qǐng)求加入到數(shù)組 return config }, function (error) { // 對(duì)請(qǐng)求錯(cuò)誤做些什么 return Promise.reject(error) } ) // 添加響應(yīng)攔截器 http.interceptors.response.use( function (response) { // 2xx 范圍內(nèi)的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么 const { data } = response; return data; }, function (error) { // 超出 2xx 范圍的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么 return Promise.reject(error); } );
axios的錯(cuò)誤重復(fù)請(qǐng)求
http.interceptors.response.use(undefined, function axiosRetryInterceptor(err) { var config = err.config; // 如果配置不存在或未設(shè)置重試選項(xiàng),則拒絕 if (!config || !config.retry) return Promise.reject(err); // 設(shè)置變量以跟蹤重試次數(shù) config.__retryCount = config.__retryCount || 0; // 判斷是否超過總重試次數(shù) if (config.__retryCount >= config.retry) { // 返回錯(cuò)誤并退出自動(dòng)重試 return Promise.reject(err); } // 增加重試次數(shù) config.__retryCount += 1; //打印當(dāng)前重試次數(shù) console.log(config.url + " 自動(dòng)重試第" + config.__retryCount + "次"); // 創(chuàng)建新的Promise var backoff = new Promise(function (resolve) { setTimeout(function () { resolve(); }, config.retryDelay || 1); }); // 返回重試請(qǐng)求 return backoff.then(function () { return axios(config); }); });
token失效返回登錄頁面
token失效返回登錄頁的原理呢就是在進(jìn)行axios請(qǐng)求時(shí),對(duì)需要拼接token的接口做的響應(yīng)式攔截中判斷請(qǐng)求數(shù)據(jù)返回的
//我們?cè)谧鯽xios封裝時(shí),我們引入axios import axios from 'axios' //請(qǐng)求攔截器和響應(yīng)式攔截器就是直接axios.跟上攔截器 //聲明一個(gè)數(shù)組,相當(dāng)于一個(gè)白名單 const whiteList=[ '/login', '/code' ] //放入不需要拼接token的接口 axios.interceptors.request.use( function (config) { // 在發(fā)送請(qǐng)求之前做些什么 return config; }, function (error) { // 對(duì)請(qǐng)求錯(cuò)誤做些什么 return Promise.reject(error); } ); // 添加響應(yīng)攔截器 axios.interceptors.response.use( function (response) { if(whiteList.includes(response.config.url)){ //如果白名單中包含請(qǐng)求的接口不做任何操作 }else{ //反之判斷返回的數(shù)據(jù)中的code或是status if(response.data.code===401) //我這邊token失效返回的是401 sessionStorage.removeItem('token') //清空存儲(chǔ)的token值 window.location('/login') //跳轉(zhuǎn)登錄頁 } // 2xx 范圍內(nèi)的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么 const { data } = response; return data; }, function (error) { // 超出 2xx 范圍的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么 return Promise.reject(error); } );
總結(jié)
到此這篇關(guān)于axios請(qǐng)求的一些常見操作的文章就介紹到這了,更多相關(guān)axios請(qǐng)求操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ElementUI實(shí)現(xiàn)在下拉列表里面進(jìn)行搜索功能詳解
有時(shí)候需要用到下拉列表全選和搜索,下面這篇文章主要給大家介紹了關(guān)于ElementUI實(shí)現(xiàn)在下拉列表里面進(jìn)行搜索功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04vue?el-input設(shè)置必填提示功能(單個(gè)與多個(gè))
有的功能需要設(shè)置必填項(xiàng),當(dāng)然也需要判斷是不是添上了,下面這篇文章主要給大家介紹了關(guān)于vue?el-input設(shè)置必填提示功能(單個(gè)與多個(gè))的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02Vue與.net?Core?接收List<T>泛型參數(shù)
這篇文章主要介紹了Vue與.net?Core?接收List<T>泛型參數(shù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04vant自定義引入iconfont圖標(biāo)及字體的方法步驟
因?yàn)関antUI給的圖標(biāo)非常少,為了滿足自己的需求,就應(yīng)該找到一種方法來向vant添加自己自定義的圖標(biāo),對(duì)于自定義圖標(biāo)我第一時(shí)間想到的就是阿里的iconfont矢量圖庫,這篇文章主要給大家介紹了關(guān)于vant自定義引入iconfont圖標(biāo)及字體的方法步驟,需要的朋友可以參考下2023-09-09利用Electron簡(jiǎn)單擼一個(gè)Markdown編輯器的方法
這篇文章主要介紹了利用Electron簡(jiǎn)單擼一個(gè)Markdown編輯器的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06vue基于html2canvas和jspdf?生成pdf?、解決jspdf中文亂碼問題的方法詳解
這篇文章主要介紹了vue基于html2canvas和jspdf?生成pdf?、解決jspdf中文亂碼問題的方法,結(jié)合實(shí)例形式詳細(xì)描述了中文亂碼問題的原因、解決方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2023-06-06vue+iview的菜單與頁簽的聯(lián)動(dòng)方式
這篇文章主要介紹了vue+iview的菜單與頁簽的聯(lián)動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07