項目axios封裝與請求api接口管理 參考資料
在api文件夾新建http.js用於封裝axios,而index.js來管理所有的api接口
http.js
/** * axios封裝 * 請求攔截、響應攔截、錯誤統一處理 */ import Vue from 'vue'; import axios from 'axios'; import router from '@/router'; import store from '@/store/index'; import { ToastPlugin } from 'vux'; Vue.use(ToastPlugin); /** * 提示函數 * 禁止點擊蒙層、顯示一秒后關閉 */ const tip = msg => { this.$vux.toast.show({ text: msg, time:1000 }); }; /** * 跳轉登錄頁 * 攜帶當前頁面路由,以期在登錄頁面完成登錄后返回當前頁面 */ const toLogin = () => { router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }); } /** * 請求失敗后的錯誤統一處理 * @param {Number} status 請求失敗的狀態碼 */ const errorHandle = (status, other) => { // 狀態碼判斷 switch (status) { // 401: 未登錄狀態,跳轉登錄頁 case 401: toLogin(); break; // 403 token過期 // 清除token並跳轉登錄頁 case 403: tip('登錄過期,請重新登錄'); localStorage.removeItem('token'); store.commit('loginSuccess', null); setTimeout(() => { toLogin(); }, 1000); break; // 404請求不存在 case 404: tip('請求的資源不存在'); break; default: console.log(other); }} // 創建axios實例 const instance = axios.create({timeout: 1000 * 12}); // 設置post請求頭 instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; /** * 請求攔截器 * 每次請求前,如果存在token則在請求頭中攜帶token */ instance.interceptors.request.use( config => { // 登錄流程控制中,根據本地是否存在token判斷用戶的登錄情況 // 但是即使token存在,也有可能token是過期的,所以在每次的請求頭中攜帶token // 后台根據攜帶的token判斷用戶的登錄情況,並返回給我們對應的狀態碼 // 而后我們可以在響應攔截器中,根據狀態碼進行一些統一的操作。 const token = store.state.token; token && (config.headers.Authorization = token); return config; }, error => Promise.error(error)); // 響應攔截器 instance.interceptors.response.use( // 請求成功 res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res), // 請求失敗 error => { const { response } = error; if (response) { // 請求已發出,但是不在2xx的范圍 errorHandle(response.status, response.data.message); return Promise.reject(response); } else { // 處理斷網的情況 // eg:請求超時或斷網時,更新state的network狀態 // network狀態在app.vue中控制着一個全局的斷網提示組件的顯示隱藏 // 關於斷網組件中的刷新重新獲取數據,會在斷網組件中說明 store.commit('changeNetwork', false); } }); export default instance;
index.js
/** * api接口統一管理 */ import $https from './https' /** * 接口域名的管理 */ const base = { sq: 'https://novel.juhe.im', bd: 'https://novel.juhe.im' }; import qs from 'qs'; // 根據需求是否導入qs模塊 const api= { // 獲取帶書籍數量的父分類 getParCaty () { return $https.get(`${base.sq}/categories`); }, // 獲取帶子分類的分類 getSubCaty () { return $https.get(`${base.sq}/sub-categories`); }, // 獲取分類詳情 category-info?gender=male&type=hot&major=奇幻&minor=&start=0&limit=20 getCatyDetail (params) { return axios.get(`${base.sq}/category-info`, { params: params }); }, // 詳情demo articleDetail (id, params) { return axios.get(`${base.sq}/topic/${id}`, { params: params }); }, // post提交demo login (params) { return axios.post(`${base.sq}/accesstoken`, qs.stringify(params)); } }; export default api
http.js中
store.commit('changeNetwork', false);
另在store中定義changeNetwork
