摘要:時隔一年再次更新下根據項目下常見業務場景對的二次封裝功能實現兼容瀏覽器避免緩存減少或更新重復請求接口域名使用環境變量全局狀態可關閉的全局錯誤提醒可開啟攜帶全局分頁參數攔截器請求攔截器請求開始請求出錯響應攔截器請求結束請求錯誤處理網絡請求中,
時隔一年再次更新下根據vue項目下常見業務場景對axios的二次封裝
功能實現:
1.兼容ie瀏覽器避免緩存
2.減少或更新重復請求
3.接口域名使用環境變量
4.全局loading狀態
5.可關閉的全局錯誤提醒
6.可開啟攜帶全局分頁參數
7...
/** * 請求攔截器 * @param {} requestStart 請求開始 */ service.interceptors.request.use( config => { requestStart({ config }); return config; }, error => { Message.error("請求出錯"); Promise.reject(error); } ); /** * 響應攔截器 * @param {} requestEnd 1.請求結束 * @param {} responseResolve 2.請求錯誤處理 */ service.interceptors.response.use( response => { const { status, data, config } = response; requestEnd({ config, data }); return responseResolve({ status, data, config }); }, error => { if (axios.isCancel(error)) { Message.warning("網絡請求中,請不要重復操作!"); } else { const { response } = error; Message.error({ dangerouslyUseHTMLString: true, message: `請求開始請求接口: ${ response.config.url }
請求方法 : ${ response.config.method }
響應狀態 : ${response.status}
響應信息 : ${ response.statusText }
` }); } store.commit("setLoading", false); store.commit("setPageTotal", 0); return Promise.reject(error); } );
處理請求頭
處理請求參數
處理重復請求
/** * 請求開始&&loading=true * @param {} requestHeaders 請求頭 * @param {} requestParams 請求參數 * @param {} removePending 重復請求 */ const requestStart = ({ config } = {}) => { requestHeaders({ config }); requestParams({ config }); removePending({ config }); addPending({ config }); store.commit("setLoading", true); };請求響應
全局錯誤提醒,在需要前端自定義提醒的場景下可關閉
/** * @param {} {status HTTP狀態碼 * @param {} data 響應體 * @param {} config}={} AxiosRequestConfig */ const responseResolve = ({ status, data, config } = {}) => { const { code, text } = data; if (status === 200) { switch (code) { case 200: return Promise.resolve(data); case 900401: Message.error(text || "登錄超時,請重新登錄!"); window.location.href = process.env.VUE_APP_AUTH_URL; return Promise.reject(data); default: //可配置錯誤提醒 if (!config.headers["hide-message"]) { Message.error(text || "操作失敗!"); } return Promise.reject(data); } } else { Message.error(text || "操作失敗!"); store.commit("setLoading", false); return Promise.reject(data); } };請求結束
處理重復請求
處理分頁
處理loading狀態
/** * 請求結束&&loading=false * @param {} {config}={} AxiosRequestConfig * @param {} {config}={} response body */ const requestEnd = ({ config, data } = {}) => { removePending({ config }); store.commit("setLoading", false); //配置分頁 if (config.headers.pagination) { const { data: content } = data; if (content) { store.commit("setPageTotal", content.total); } } };以下為具體功能實現 請求頭預處理
時間戳:避免ie內核瀏覽器緩存
token
/** * 請求頭預處理 * @param {} {config} AxiosRequestConfig */ const requestHeaders = ({ config }) => { //1.時間戳 const timestamp = new Date().getTime(); config.headers.timestamp = timestamp; //2.token const token = sessionStorage.getItem("token"); if (token) { config.headers.token = token; } };請求參數預處理
可配置的全局分頁參數,提供給需要用到全局分頁組件的列表請求使用
/** * 請求參數預處理 * @param {} {config}={} AxiosRequestConfig */ const requestParams = ({ config } = {}) => { //配置分頁 if (config.headers.pagination) { const { pageNum, pageSize } = store.getters.getPagination; config.data = Object.assign({}, config.data, { pageNum, pageSize }); } };處理重復請求
此處根據需要可以改為取消上一次的請求
/** * 處理重復請求 * @param {} {config}={} AxiosRequestConfig */ const addPending = ({ config }) => { const url = config.url + "&" + config.method + "&" + qs.stringify(config.data); config.cancelToken = new cancelToken(cancel => { if (!pending.some(item => item.url === url)) { pending.push({ url, cancel }); } }); }; const removePending = ({ config }) => { const url = config.url + "&" + config.method + "&" + qs.stringify(config.data); pending.forEach((item, index) => { if (item.url === url) { item.cancel("取消重復請求:" + config.url); pending.splice(index, 1); } }); };完整代碼
import { Message } from "element-ui"; import axios from "axios"; import store from "../store/index"; const qs = require("qs"); const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 100000 }); const pending = []; const cancelToken = axios.CancelToken; /** * 處理重復請求 * @param {} {config}={} AxiosRequestConfig */ const addPending = ({ config }) => { const url = config.url + "&" + config.method + "&" + qs.stringify(config.data); config.cancelToken = new cancelToken(cancel => { if (!pending.some(item => item.url === url)) { pending.push({ url, cancel }); } }); }; const removePending = ({ config }) => { const url = config.url + "&" + config.method + "&" + qs.stringify(config.data); pending.forEach((item, index) => { if (item.url === url) { item.cancel("取消重復請求:" + config.url); pending.splice(index, 1); } }); }; /** * 請求頭預處理 * @param {} {config} AxiosRequestConfig */ const requestHeaders = ({ config }) => { //1.時間戳 const timestamp = new Date().getTime(); config.headers.timestamp = timestamp; //2.token const token = sessionStorage.getItem("token"); if (token) { config.headers.token = token; } }; /** * 請求參數預處理 * @param {} {config}={} AxiosRequestConfig */ const requestParams = ({ config } = {}) => { //配置分頁 if (config.headers.pagination) { const { pageNum, pageSize } = store.getters.getPagination; config.data = Object.assign({}, config.data, { pageNum, pageSize }); } }; /** * 請求開始&&loading=true * @param {} requestHeaders 1.配置請求頭 * @param {} requestParams 2.配置請求體 * @param {} removePending 3.處理重復請求 */ const requestStart = ({ config } = {}) => { requestHeaders({ config }); requestParams({ config }); removePending({ config }); addPending({ config }); store.commit("setLoading", true); }; /** * 請求結束&&loading=false * @param {} {config}={} AxiosRequestConfig * @param {} {config}={} response body */ const requestEnd = ({ config, data } = {}) => { removePending({ config }); store.commit("setLoading", false); //配置分頁 if (config.headers.pagination) { const { data: content } = data; if (content) { store.commit("setPageTotal", content.total); } } }; /** * @param {} {status HTTP狀態碼 * @param {} data 響應體 * @param {} config}={} AxiosRequestConfig */ const responseResolve = ({ status, data, config } = {}) => { const { code, text } = data; if (status === 200) { switch (code) { case 200: return Promise.resolve(data); case 900401: Message.error(text || "登錄超時,請重新登錄!"); window.location.href = process.env.VUE_APP_AUTH_URL; return Promise.reject(data); default: //可配置錯誤提醒 if (!config.headers["hide-message"]) { Message.error(text || "操作失敗!"); } return Promise.reject(data); } } else { Message.error(text || "操作失敗!"); store.commit("setLoading", false); return Promise.reject(data); } }; /** * 請求攔截器 * @param {} requestStart 請求開始 */ service.interceptors.request.use( config => { requestStart({ config }); return config; }, error => { Message.error("請求出錯"); Promise.reject(error); } ); /** * 響應攔截器 * @param {} requestEnd 1.請求結束 * @param {} responseResolve 2.請求錯誤處理 */ service.interceptors.response.use( response => { const { status, data, config } = response; requestEnd({ config, data }); return responseResolve({ status, data, config }); }, error => { if (axios.isCancel(error)) { Message.warning("網絡請求中,請不要重復操作!"); } else { const { response } = error; Message.error({ dangerouslyUseHTMLString: true, message: `請求接口: ${ response.config.url }
請求方法 : ${ response.config.method }
響應狀態 : ${response.status}
響應信息 : ${ response.statusText }
` }); } store.commit("setLoading", false); store.commit("setPageTotal", 0); return Promise.reject(error); } ); export default service;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106002.html
摘要:是一個基于的庫,可以用在瀏覽器和中。我在最近的幾個項目中都有使用,并基于根據常見的業務場景封裝了一個通用的服務。業務場景全局請求配置。請求攜帶,權限錯誤統一管理。 axios axios 是一個基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。在前端框架中的應用也是特別廣泛,不管是vue還是react,都有很多項目用axios作為網絡請求庫。我在最近的幾個項...
摘要:攔截重復請求如何標識每個請求下面函數,通過一個請求參數中的請求傳遞參數或請求傳遞參數來表示每一個請求。 一直想封裝一下 axios, 可以方便項目中使用,今天有時間,就好好研究了一下。 源碼: // util/axios.js import axios from axios const pending = {} const CancelToken = axios.CancelTok...
摘要:并且數據同步后默認會保存下來,這樣下次再請求時存儲層中就有數據了。以下參數會傳到中這么一來,存儲層就和接口層對接起來了。五支持永久保存在某些場景下,可能不方便寫過期時間,這時默認可以傳遞,標記該數據永不過期。 零、問題的由來 開門見山地說,這篇文章【又】是一篇安利軟文~,安利的對象就是 tua-storage。 顧名思義,這就是一款存儲數據的工具。 用 tua-storage 好處大大...
摘要:使用了攔截器處理相關問題,這樣就不再需要使用來做錯誤的處理。萬惡的攔截器一些處理無論是對成功的處理還是對失敗的處理,如果攔截器不拋出錯誤,那么終將還會執行里面處理請求成功的函數,即使你返回。 一 前言 本文適合剛接觸axios或者使用過幾次的同學來分享交流一些入門經驗,本文同樣適用熟悉axios的同學來作為參考手冊。默認你已經看過axios的相關文檔:axios文檔 GitHub,通過...
摘要:前端基本功常見概念一點這里前端基本功常見概念二點這里前端基本功常見概念三點這里什么是原型鏈當一個引用類型繼承另一個引用類型的屬性和方法時候就會產生一個原型鏈。函數式編程是聲明式而不是命令式,并且應用程序狀態通過純函數流轉。 前端基本功-常見概念(一) 點這里前端基本功-常見概念(二) 點這里前端基本功-常見概念(三) 點這里 1.什么是原型鏈 當一個引用類型繼承另一個引用類型的屬性和方...
閱讀 1718·2021-10-18 13:34
閱讀 3905·2021-09-08 10:42
閱讀 1551·2021-09-02 09:56
閱讀 1605·2019-08-30 15:54
閱讀 3126·2019-08-29 18:44
閱讀 3297·2019-08-26 18:37
閱讀 2212·2019-08-26 12:13
閱讀 453·2019-08-26 10:20