uni-app網(wǎng)絡(luò)請(qǐng)求的攔截器配置與錯(cuò)誤處理

在uni-app中,通過(guò)封裝統(tǒng)一的網(wǎng)絡(luò)請(qǐng)求工具并配置攔截器,可實(shí)現(xiàn)請(qǐng)求攔截、響應(yīng)處理、錯(cuò)誤提示和自動(dòng)重試等功能。具體包括:1. 使用攔截器統(tǒng)一添加header、顯示loading、處理狀態(tài)碼;2. 分類(lèi)處理網(wǎng)絡(luò)層、http、業(yè)務(wù)層錯(cuò)誤,如斷網(wǎng)提示、狀態(tài)碼日志記錄、Token失效跳轉(zhuǎn)登錄;3. 封裝全局錯(cuò)誤監(jiān)聽(tīng)與自動(dòng)重試機(jī)制,提升應(yīng)用健壯性;4. 引入配置項(xiàng)實(shí)現(xiàn)攔截器靈活控制,便于調(diào)試與線上行為分離,從而規(guī)范項(xiàng)目網(wǎng)絡(luò)請(qǐng)求邏輯,提高可維護(hù)性。

在uni-app中,網(wǎng)絡(luò)請(qǐng)求的攔截和錯(cuò)誤處理是提升應(yīng)用健壯性和用戶(hù)體驗(yàn)的關(guān)鍵環(huán)節(jié)。很多人在開(kāi)發(fā)過(guò)程中容易忽略這部分配置,導(dǎo)致接口異常時(shí)無(wú)法及時(shí)反饋或統(tǒng)一處理。其實(shí)通過(guò)合理使用攔截器和全局錯(cuò)誤處理邏輯,可以有效減少重復(fù)代碼、統(tǒng)一錯(cuò)誤提示,還能自動(dòng)做一些兜底操作,比如斷網(wǎng)重試、token失效跳轉(zhuǎn)登錄等。

一、攔截器的作用與基本配置

攔截器本質(zhì)上是對(duì)發(fā)起請(qǐng)求和響應(yīng)返回這兩個(gè)階段進(jìn)行“干預(yù)”。在uni-app中,通常基于uni.request封裝一個(gè)統(tǒng)一的網(wǎng)絡(luò)請(qǐng)求工具,并在其基礎(chǔ)上添加請(qǐng)求攔截和響應(yīng)攔截。

以常見(jiàn)的封裝方式為例:

const http = {   request(options) {     // 請(qǐng)求攔截器     uni.showLoading({ title: '加載中' });      // 添加默認(rèn)參數(shù)     options.url = 'https://api.example.com' + options.url;     options.header = {       ...options.header,       'Authorization': 'Bearer ' + store.getters.token     };      return new Promise((resolve, reject) => {       uni.request({         ...options,         success: (res) => {           // 響應(yīng)攔截器           uni.hideLoading();           if (res.statusCode === 200) {             resolve(res.data);           } else {             uni.showToast({ title: '請(qǐng)求異常', icon: 'none' });             reject(res);           }         },         fail: (err) => {           uni.hideLoading();           uni.showToast({ title: '網(wǎng)絡(luò)出錯(cuò)', icon: 'none' });           reject(err);         }       });     });   } };

在這個(gè)結(jié)構(gòu)里,你可以在每次請(qǐng)求發(fā)出前統(tǒng)一加header、顯示loading,在收到響應(yīng)后判斷狀態(tài)碼、隱藏loading、彈提示等。

二、常見(jiàn)錯(cuò)誤類(lèi)型及處理策略

網(wǎng)絡(luò)請(qǐng)求可能遇到的錯(cuò)誤大致分為三類(lèi):網(wǎng)絡(luò)層錯(cuò)誤(如無(wú)網(wǎng)、超時(shí))HTTP 錯(cuò)誤(如404、500)業(yè)務(wù)層錯(cuò)誤(如 token 失效、權(quán)限不足)

針對(duì)這幾種情況,我們可以做不同的處理:

  • 網(wǎng)絡(luò)錯(cuò)誤:彈窗提示用戶(hù)檢查網(wǎng)絡(luò)連接,或者嘗試重新發(fā)送一次。
  • HTTP 狀態(tài)碼非 200:記錄日志,展示通用錯(cuò)誤信息。
  • 業(yè)務(wù)錯(cuò)誤:根據(jù)后端返回的特定字段(如 code !== 0)來(lái)提示具體問(wèn)題,甚至觸發(fā)特定行為(如跳回登錄頁(yè))。

舉個(gè)例子:

if (res.code === 401) {   uni.showToast({ title: '身份已過(guò)期,請(qǐng)重新登錄', icon: 'none' });   setTimeout(() => {     uni.reLaunch({ url: '/pages/login/login' });   }, 1500); }

這類(lèi)處理放在攔截器中會(huì)更集中,也更容易維護(hù)。

三、如何實(shí)現(xiàn)全局錯(cuò)誤監(jiān)聽(tīng)與自動(dòng)重試

uni-app本身沒(méi)有提供全局錯(cuò)誤監(jiān)聽(tīng)機(jī)制,但可以通過(guò)封裝的方式來(lái)實(shí)現(xiàn)類(lèi)似功能。例如,在封裝的http.JS中統(tǒng)一處理錯(cuò)誤,并對(duì)外暴露一個(gè)可配置的錯(cuò)誤回調(diào)函數(shù)

此外,還可以加上簡(jiǎn)單的重試機(jī)制,比如在失敗時(shí)自動(dòng)重試一次:

let retryCount = 0;  function requestWithRetry(options) {   return new Promise((resolve, reject) => {     const doRequest = () => {       http.request(options)         .then(resolve)         .catch((err) => {           if (retryCount < 1) {             retryCount++;             uni.showToast({ title: '正在重試...', icon: 'loading' });             setTimeout(doRequest, 1000);           } else {             reject(err);           }         });     };     doRequest();   }); }

這種做法適用于一些偶發(fā)性錯(cuò)誤,比如短暫斷網(wǎng)、服務(wù)器不穩(wěn)定等情況。

四、小技巧:把攔截器做得更靈活一點(diǎn)

如果你希望攔截器能根據(jù)不同環(huán)境(開(kāi)發(fā)/生產(chǎn))或不同模塊做差異化處理,可以在封裝的時(shí)候預(yù)留鉤子函數(shù),或者引入配置項(xiàng)。

比如:

const config = {   enableLog: process.env.NODE_ENV === 'development',   timeout: 10000 };  // 在攔截器中使用 config.enableLog 打印調(diào)試信息

這樣既能方便調(diào)試,又不會(huì)影響線上行為。


基本上就這些了。攔截器不是什么高深技術(shù),但用好了可以讓整個(gè)項(xiàng)目的網(wǎng)絡(luò)請(qǐng)求變得更規(guī)范、易維護(hù)。關(guān)鍵是把它封裝好之后堅(jiān)持使用,而不是到處寫(xiě)裸的uni.request。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享