打造精簡高效的 uni-app 網絡請求工具

在 uni-app 開發中,網絡請求是連接前端與后端的核心橋梁。一個設計良好的請求工具能夠顯著提升開發效率,減少重復代碼。本文將分享一個精簡版的 uni-app 網絡請求工具實現,它保留了核心功能同時保持了足夠的靈活性。

設計思路

一個優秀的網絡請求工具應當具備以下特點:

  • 配置集中管理,便于維護
  • 支持常用的 GET 和 POST 請求
  • 自動處理基礎 URL 拼接
  • 統一的加載狀態管理
  • 簡潔的錯誤處理機制
  • 可擴展性強

基于以上原則,我們實現了一個輕量級但功能完備的網絡請求工具。

實現代碼解析

基礎配置

首先,我們定義了請求的基礎配置,包括基礎 URL、請求頭、超時設置等:

config: {baseURL: setting.IS_DEV ? setting.DEV_URL : setting.PRO_URL,header: {'Content-Type': 'application/json;charset=UTF-8'},dataType: "json",responseType: "text",// 條件編譯,針對不同平臺設置超時// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXINtimeout: setting.TIMEOUT,// #endif// 其他平臺特定配置...
}

這里使用了 uni-app 的條件編譯特性,為不同平臺設置了合適的參數,體現了跨平臺開發的特點。

加載狀態管理

為了提供良好的用戶體驗,我們實現了加載狀態的自動管理:

/*** 顯示無文字的轉圈加載動畫*/
showLoading() {uni.showLoading({title: '', // 空文字,僅顯示圖標mask: true, // 透明蒙層防止操作穿透icon: 'loading'});
},/*** 隱藏加載動畫*/
hideLoading() {uni.hideLoading();
},

這種設計可以避免在每個請求前后手動調用加載動畫,減少了重復代碼。

請求方法封裝

我們分別封裝了 GET 和 POST 方法,讓 API 調用更加直觀:

/*** 發送GET請求* @param {string} url - 請求地址* @param {object} data - 請求參數* @param {object} options - 額外配置項* @returns {Promise}*/
get(url, data, options) {return this.request({...options,url,data,method: 'GET'});
},/*** 發送POST請求* @param {string} url - 請求地址* @param {object} data - 請求參數* @param {object} options - 額外配置項* @returns {Promise}*/
post(url, data, options) {return this.request({...options,url,data,method: 'POST',header: {...options?.header,'Content-Type': 'application/x-www-form-urlencoded'}});
},

POST 方法特別設置了適合表單提交的 Content-Type,同時保留了配置項的靈活性。

核心請求邏輯

request 方法是整個工具的核心,負責處理實際的網絡請求:

request(options) {// 合并配置const config = {...this.config,...options};config.header = {...this.config.header,...options.header};// 處理請求URLconfig.url = config.baseURL + config.url;// 添加tokenconst token = uni.getStorageSync('token') || '';if (token) {config.header.Authorization = `Bearer ${token}`;}this.showLoading();return new Promise((resolve, reject) => {uni.request(config).then(([err, res]) => {this.hideLoading();if (err) {return reject(err);}// 檢查返回數據中的code值if (res.data && res.data.code !== 200) {const error = new Error(`請求錯誤,錯誤碼: ${res.data.code}`);error.code = res.data.code;error.response = res;return reject(error);}resolve(res);}).catch(error => {this.hideLoading(); reject(error);});});
}

這段代碼實現了幾個關鍵功能:

  1. 配置合并,允許全局配置與單次請求配置結合
  2. URL 自動拼接,無需在每次請求時手動拼接基礎 URL
  3. Token 自動附加,簡化身份驗證流程
  4. 統一的錯誤處理,當返回 code 不等于 200 時視為失敗
  5. 自動管理加載狀態,請求開始時顯示,結束時隱藏

使用示例

使用這個工具非常簡單,只需導入后直接調用即可:

import request from '@/utils/request.js';// 發送GET請求
async function fetchData() {try {const res = await request.get('/api/data', { id: 1 });console.log('數據獲取成功', res.data);} catch (error) {console.error('數據獲取失敗', error);}
}// 發送POST請求
async function submitForm(formData) {try {const res = await request.post('/api/submit', formData);console.log('提交成功', res.data);} catch (error) {console.error('提交失敗', error);}
}

總結

本文介紹了一個精簡版的 uni-app 網絡請求工具,它具有以下特點:

  1. 簡潔高效:保留核心功能,去除冗余代碼,讓請求邏輯更加清晰
  2. 易用性強:封裝了 GET 和 POST 方法,API 設計直觀,降低使用門檻
  3. 統一管理:集中處理 URL 拼接、加載狀態、Token 附加等共性邏輯
  4. 錯誤處理:當返回 code 不等于 200 時統一視為失敗,簡化錯誤處理流程
  5. 跨平臺兼容:利用 uni-app 的條件編譯特性,適配不同平臺的特性

這個工具可以作為項目的基礎網絡層,根據實際需求進行擴展。例如,可以添加請求攔截器、響應攔截器、錯誤重試等功能,使其更加強大。

通過封裝網絡請求,我們可以在項目中實現代碼復用,減少重復勞動,同時也便于后期維護和功能擴展。這種設計思想不僅適用于 uni-app,也可以應用于其他前端框架的網絡請求處理中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/97879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97879.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【面試場景題】交易流水表高qps寫入會有鎖等待或死鎖問題嗎

文章目錄一、先明確交易流水表的核心特性二、InnoDB的鎖機制在流水表寫入場景的表現1. 行鎖(Record Lock):基本不涉及2. 間隙鎖(Gap Lock)與Next-Key Lock:幾乎不觸發3. 表鎖:僅在極端場景出現三…

項目部署——LAMP、LNMP和LTMJ

前情提要問:如何通過nginx的反向代理,代理多臺虛擬主機(一臺apache服務器上的虛擬主機)?1.在nginx的配置文件中,將基于域名的訪問改為基于端口的訪問(nginx.conf)upstream daili{ser…

晨曦中,它已勞作:一臺有溫度的機器人如何重塑我們的潔凈日常

清晨六點,城市的輪廓在微光中逐漸清晰。某高端小區的路面上,一臺灰色機身、線條流暢的機器正在安靜地工作。它繞過停靠的車輛,精準地沿著路緣石前進,吸走落葉與塵土,遇到突然竄出的流浪貓時輕巧避讓,仿佛有…

【最新高級版】酷柚易汛生產管理系統v1.2.8 +uniapp全開源+文檔教程

酷柚易汛生產管理系統是基于FastAdminThinkPHPLayuiuniapp開發的生產管理系統,幫助企業數字化轉型,打造智能工廠,專業為生產企業量身開發的一套完整的生產管理系統。主要包含以下模塊:購貨模塊、生產模塊、倉庫模塊、資料模塊&…

40分鐘的Docker實戰攻略

一:什么是Docker (1)基本概念 Docker 是一種開源的 容器化平臺,用于快速構建、部署和運行應用程序。它通過將應用程序及其依賴項打包到輕量級的、可移植的容器中,實現了環境一致性,解決了“在我機器上能運…

qt使用camke時,采用vcpkg工具鏈設置OSG的qt模塊osgQOpenGLWidget

【免費】osgQOpenGLWidget嵌入qt模塊,VS2022使用cmake的方式,工具鏈vcpkg資源-CSDN下載 CMake中設置 1.查找osg相關的庫,同時也會設置對應include的路徑 # 檢查是否找到 osg find_package(OpenSceneGraph 3.6.5REQUIRED COMPONENTS osgosgUtilosgGAosgViewerosgDBosgAnimatio…

洛谷 P2245 星際導航(kruskal 重構樹 + 倍增優化求路徑最大邊權)

題目鏈接 題目難度 洛谷上是藍題&#xff0c;我覺得這道題挺簡單的&#xff0c;一眼就看穿了&#xff0c;應該是綠題。 題目解法概括 kruskal 重構樹 倍增優化求路徑最大邊權。 代碼 #include <iostream> #include <vector> #include <algorithm> #in…

STM32H743-ARM例程1-IDE環境搭建與調試下載

目錄實驗平臺環境搭建一、Keil MDK集成開發環境1.MDK簡介2.MDK5安裝3.程序下載與調試二、STM32CubeMX1.STM32CubeMX簡介2.JAVA JRE安裝3.STM32CubeMX安裝4.STM32CubeH7庫安裝實驗平臺 硬件&#xff1a;銀杏科技GT7000雙核心開發板-ARM-STM32H743XIH6&#xff0c;銀杏科技iTool…

FPGA學習篇——Verilog學習MUX的實現

PS&#xff1a;目前手上仍然沒有板子&#xff0c;按照野火視頻的講解&#xff0c;目前我們只能做到前面六步&#xff08;其實第一步設計規劃也是需要看板子的硬件的&#xff0c;但是現在沒有板子就完全與野火傳授的板子一致來看&#xff09; 首先我們以最簡單的2路選擇器MUX2_1…

OpenStack 學習筆記

OpenStack 1. 什么是 OpenStack 1.1 OpenStack 發展史 2006 年亞馬遜推出 AWS&#xff0c;正式開啟云計算的新紀元 2010 年 7 月美國國家航空航天局&#xff08;NASA&#xff09;與 Rackspace 合作&#xff0c;共同宣布 OpenStack 開放源碼計劃&#xff0c;由此開啟了屬于 Open…

mysql小數取整

1 向下取整 SELECT FLOOR(123.456); -- 結果: 1232 向上取整 SELECT CEIL(123.001); -- 結果: 1243 四舍五入 SELECT ROUND(123.456); -- 結果: 123 SELECT ROUND(123.556); -- 結果: 1244 截斷&#xff08;不四舍五入&#xff0c;直接截斷小數位&#xff09; SELECT …

Day43 PHP(mysql不同注入類型、mysql不同注入點、mysql傳輸不同數據類型 )

一、不同注入類型實際&#xff1a;我們未知sql是哪種類型&#xff0c;只能靠試/使用sql工具原理&#xff1a;閉合程序員寫的sql語句&#xff0c;并且執行我們所需要的sql語句&#xff0c;最后將閉合后多余的 用-- 或者#注釋掉。 總結一下就是先閉合&#xff0c;后注釋。共四種…

Linux應用開發(君正T23):三網智能切換及配網功能

前段時間接手了一個監控項目&#xff0c;其中甲方對于設備的要求有一條就是實現網口eth、WiFi、4G三種手段的聯網方式并且當某一個網絡不好的時候就去切換到下一個能用的網絡&#xff0c;讓監控設備持續不斷的有網絡&#xff0c;保證監控數據的上傳。這個部分的功能就交由我來實…

IvorySQL 4.6:DocumentDB+FerretDB 實現 MongoDB 兼容部署指南

背景 MongoDB 誕生之初&#xff0c;便以出色的易用性與詳盡的驅動程序文檔脫穎而出&#xff0c;堪稱對傳統關系型數據庫的一次重要革新&#xff0c;也正因如此&#xff0c;它迅速成為開發者社區的熱門之選。 然而&#xff0c;隨著其許可模式從開源轉向 SSPL 許可證&#xff0…

論文閱讀:arixv 2025 One Token to Fool LLM-as-a-Judge

總目錄 大模型相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2507.08794 https://www.doubao.com/chat/20698287584991234 速覽 這篇文檔主要講了一個關于“大語言模型當裁判”的重要發現——很多我們以為靠譜的AI裁…

webrtc弱網-AlrDetector類源碼分析與算法原理

AlrDetector&#xff08;應用受限區域檢測器&#xff09;是WebRTC中用于檢測發送端是否處于應用層限速狀態的核心組件。它通過維護一個基于時間間隔的預算系統&#xff0c;監控實際發送數據量與網絡容量之間的關系。當發送速率持續低于網絡容量的設定比例&#xff08;如65%&…

ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸

ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸 ?? ?? 目錄 ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸 ?? 0) TL;DR ? 1) 背景與目標 ?? 2) 架構與職責(解耦渲染器) ?? 3) “確定性”前置條件(去偽差異) ?? 4) PDF 回歸策略(以 QuestPDF 為例) ?? 4.…

SIFT特征匹配實戰:KNN算法實現指紋認證

這個利用了前面學到的SIFT特征檢測來實現的&#xff0c;然后這里主要就是引入了一個新的匹配器。這里匹配是用KNN算法進行匹配的。下面來看下細節。介紹函數由于要頻繁展示&#xff0c;所以這里定義了一個函數。def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)導入…

網絡安全滲透測試第一步信息收集

信息收集是滲透測試中最基礎且關鍵的一步&#xff0c;它直接影響后續漏洞發現和利用的成功率。本文將系統介紹信息收集的常用方法、工具和技巧&#xff0c;幫助你在實戰中高效定位目標弱點。 一、搜索引擎利用 1. Google Hacking 通過Google搜索語法快速定位敏感信息、后臺地…

C++——類和對象1

1.類的定義1.1 類定義格式class為定義類的關鍵字&#xff0c;Stack為類的名字&#xff0c;{ }中的內容是類的主題為了&#xff0c;注意類定義結束時后面的分號不能省略。類體中的內容稱為類的成員&#xff1a;類中的變量稱為類的屬性或成員變量&#xff1b;類中的函數稱為類的方…