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