axios的全域性攔截之axios.interceptors

前端開膛手發表於2018-11-08

vue專案裡,每一個檔案,沒一個模組都可能呼叫介面,那麼就有請求正常、請求出錯的情況,請求正常裡又有成功返回資料和出現錯誤的情況,如果每次呼叫介面都重新寫一遍邏輯,是很沒必要的,那麼有沒有辦法能把公共的業務邏輯抽離出來呢?

答案當然是有的。

在入口檔案main.js裡使用axios的全域性攔截器axios.interceptors,同時可以結合vue-router來處理請求之後的各種跳轉等等。

大概配置如下,可根據具體情況自己改寫:

axios.interceptors.response.use(    
response => {        
// 如果返回的狀態碼為200,說明介面請求成功,可以正常拿到資料        
// 否則的話丟擲錯誤        
// if (response.status === 200) {        
//   return Promise.resolve(response);        
// } else {        
//   return Promise.reject(response);        
// }        
if (response.data.success || response.data.success === undefined) {            
console.log(iView);            
iView.Message.info("response.data.error");            
return Promise.resolve(response);        
} else {            
iView.Message.info("response.data.error");            
return Promise.reject(response);        
}    },    
// 伺服器狀態碼不是2開頭的的情況    
// 這裡可以跟你們的後臺開發人員協商好統一的錯誤狀態碼    
// 然後根據返回的狀態碼進行一些操作,例如登入過期提示,錯誤提示等等    
// 下面列舉幾個常見的操作,其他需求可自行擴充套件    
error => {        
if (error.response.status) {            
switch (error.response.status) {                
// 401: 未登入                
// 未登入則跳轉登入頁面,並攜帶當前頁面的路徑                
// 在登入成功後返回當前頁面,這一步需要在登入頁操作。                
case 401:                    
// router.replace({                   
//   path: "/login",                    
//   query: {                    
//     redirect: router.currentRoute.fullPath                    
//   }                    
// });                    
break;                   
// 403 token過期                    
// 登入過期對使用者進行提示                    
// 清除本地token和清空vuex中token物件                    
// 跳轉登入頁面                
case 403:                    
// Toast({                    
//   message: "登入過期,請重新登入",                    
//   duration: 1000,                    
//   forbidClick: true                    
// });                    
// // 清除token                    
// localStorage.removeItem("token");                    
// store.commit("loginSuccess", null);                    
// // 跳轉登入頁面,並將要瀏覽的頁面fullPath傳過去,
//登入成功後跳轉需要訪問的頁面                    
// setTimeout(() => {                    
//   router.replace({                    
//     path: "/login",                    
//     query: {                    
//       redirect: router.currentRoute.fullPath                    
//     }                    
//   });                    
// }, 1000);                    
break;                    
// 404請求不存在                
case 404:                    
// Toast({                    
//   message: "網路請求不存在",                    
//   duration: 1500,                    
//   forbidClick: true                    
// });                    
break;                    
// 其他錯誤,直接丟擲錯誤提示                
default:                    
// Toast({                    
//   message: error.response.data.message,                    
//   duration: 1500,                    
//   forbidClick: true                    
// });            
}            
return Promise.reject(error.response);        
}    
});

複製程式碼


相關文章