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