UniApp 中封裝 HTTP 請求與 Token 管理(附Demo)

目錄

  • 1. 基本知識
  • 2. Demo
  • 3. 拓展

1. 基本知識

從實戰代碼中學習,上述實戰代碼來源:芋道源碼/yudao-mall-uniapp

在這里插入圖片描述

該代碼中,通過自定義 request 函數對 HTTP 請求進行了統一管理,并且結合了 Token 認證機制

  1. 請求封裝原理,request 函數是對 uni.request 的一個封裝
  • 動態設置請求頭:根據 config 的配置,決定是否需要在請求頭中附加 Authorization(Bearer Token)。Token 是從本地存儲中獲取的
  • 根據環境區分不同的 Base URL:根據當前的開發環境(development 或 production),動態設置請求的基礎 URL(baseUrl)
  • 統一處理請求參數:config.params 會被轉化成查詢字符串,拼接到請求的 URL 后面
  • Promise 封裝異步操作:請求通過 uni.request 發出,并將返回的 response 數據封裝為一個 Promise,使得調用 request 的地方可以使用 then 或 catch 來處理結果
  1. Token 認證管理原理
  • Token 存儲:uni.setStorageSync 和 uni.getStorageSync 被用來在客戶端本地存儲 ACCESS_TOKEN 和 REFRESH_TOKEN,這兩個 Token 被用于身份驗證
  • 獲取 Token:在每次 HTTP 請求時,首先會檢查請求是否需要 Token(通過 config.headers.isToken 判斷)。如果需要,就從本地存儲中獲取 AccessToken 并加入到請求頭中
  • Token 過期處理:當請求返回的狀態碼為 401 時,表示 Token 已過期,此時會彈出提示框,讓用戶重新登錄并清除舊的 Token
  1. 錯誤處理機制
  • 網絡錯誤:封裝了常見的網絡錯誤(如超時、服務器錯誤等),并提供了友好的提示
  • 接口返回錯誤:統一處理接口返回的錯誤,錯誤信息根據 res.data.code 的值來決定,如果返回的是 500 錯誤或其他非 200 的錯誤,則通過 toast 提示給用戶
  • 401 錯誤處理:當返回狀態碼為 401 時,表示 Token 過期或無效,代碼會自動處理登出流程

2. Demo

根據實戰中的Demo,給出一版通用的Demo:

封裝request的時候,需要與token結合:

// utils/request.js
import { getAccessToken, setToken, removeToken } from '@/utils/auth';
import config from '@/config';
import errorCode from '@/utils/errorCode';
import { toast, showConfirm } from '@/utils/common';let timeout = 10000;
let baseUrl = process.env.NODE_ENV === 'development' ? config.devbaseUrl : config.prodbaseUrl;const request = config => {const isToken = (config.headers || {}).isToken === false;config.header = config.header || {};if (getAccessToken() && !isToken) {config.header['Authorization'] = 'Bearer ' + getAccessToken();}config.header['tenant-id'] = '1'; // 強制設置租戶 IDif (config.params) {let url = config.url + '?' + tansParams(config.params);url = url.slice(0, -1);config.url = url;}return new Promise((resolve, reject) => {uni.request({method: config.method || 'get',timeout: config.timeout || timeout,url: config.baseUrl || baseUrl + config.url,data: config.data,header: config.header,dataType: 'json'}).then(response => {let [error, res] = response;if (error) {toast('后端接口連接異常');reject('后端接口連接異常');return;}const code = res.data.code || 200;const msg = errorCode[code] || res.data.msg || errorCode['default'];if (code === 401) {showConfirm('登錄狀態已過期,您可以繼續留在該頁面,或者重新登錄?').then(res => {if (res.confirm) {removeToken();uni.reLaunch({ url: '/pages/login' });}});reject('無效的會話,或者會話已過期,請重新登錄。');} else if (code === 500) {toast(msg);reject('500');} else if (code !== 200) {toast(msg);reject(code);}resolve(res.data);}).catch(error => {let { message } = error;if (message === 'Network Error') message = '后端接口連接異常';else if (message.includes('timeout')) message = '系統接口請求超時';else if (message.includes('Request failed with status code')) message = '系統接口' + message.substr(message.length - 3) + '異常';toast(message);reject(error);});});
};export default request;

對應的token文件:

// utils/auth.js
const AccessTokenKey = 'ACCESS_TOKEN';
const RefreshTokenKey = 'REFRESH_TOKEN';export function getAccessToken() {return uni.getStorageSync(AccessTokenKey);
}export function getRefreshToken() {return uni.getStorageSync(RefreshTokenKey);
}export function setToken(token) {uni.setStorageSync(AccessTokenKey, token.accessToken);uni.setStorageSync(RefreshTokenKey, token.refreshToken);
}export function removeToken() {uni.removeStorageSync(AccessTokenKey);uni.removeStorageSync(RefreshTokenKey);
}

相關接口請求:

// 在頁面中調用封裝的請求方法
import request from '@/utils/request';export default {methods: {fetchData() {request({url: '/api/getData',method: 'GET',params: { id: 123 }}).then(response => {console.log('數據:', response);}).catch(error => {console.log('請求失敗:', error);});}}
}

3. 拓展

process.env.NODE_ENV 是 Node.js 環境中用于獲取當前應用運行環境的一個變量

在大多數前端框架(如 Vue、React)以及后端框架(如 Express)中,process.env.NODE_ENV 被廣泛用于區分不同的開發環境

前端vue中可能已經標明了
在開發模式下:NODE_ENV=development npm run dev
在生產模式下:NODE_ENV=production npm run build
在 npm 腳本中,可以通過 cross-env 等工具來跨平臺設置環境變量:

"scripts": {"dev": "cross-env NODE_ENV=development vue-cli-service serve","build": "cross-env NODE_ENV=production vue-cli-service build"
}

另外一個接口超時時間,全局默認是20秒,如果時長不對,可以在單獨某個接口設置:

// 上傳圖片
uploadImage(data) {return upload({url: '/infra/file/upload',method: 'upload',filePath: data.filePath,timeout: 30000  // 設置超時時間為30秒});
}

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

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

相關文章

初階數據結構習題【3】(1時間和空間復雜度)——203移除鏈表元素

1. 題目描述 力扣在線OJ——移除鏈表元素 給你一個鏈表的頭節點 head 和一個整數 val ,請你刪除鏈表中所有滿足 Node.val val 的節點,并返回 新的頭節點 。 示例1: 輸入:head [1,2,6,3,4,5,6], val 6 輸出:[1,2,3…

互聯網+房產中介+裝修設計+物料市場+智能家居一體化平臺需求書

一、項目概述 1.1 項目背景 隨著互聯網技術的飛速發展以及人們生活品質的顯著提升,傳統房產交易、裝修設計、家居購物等領域暴露出諸多問題。信息不對稱使得用戶難以獲取全面準確的信息,在房產交易中可能高價買入或低價賣出,裝修時可能遭遇…

15.13 AdaLoRA自適應權重矩陣微調:動態秩調整的智能革命

AdaLoRA自適應權重矩陣微調:動態秩調整的智能革命 一、技術架構解析 #mermaid-svg-u3TfE3YrkeWSjem2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u3TfE3YrkeWSjem2 .error-icon{fill:#552222;}#mermaid-svg-u3…

P9231 [藍橋杯 2023 省 A] 平方差

P9231 [藍橋杯 2023 省 A] 平方差 - 洛谷 題目描述 給定 L,R,問 L≤x≤R 中有多少個數 x 滿足存在整數 y,z 使得 xy2?z2。 輸入格式 輸入一行包含兩個整數 L,R,用一個空格分隔。 輸出格式 輸出一行包含一個整數滿足題目給定條件的 x 的數量。 輸…

【GenBI優化】提升text2sql準確率:建議使用推理大模型,增加重試

引言 Text-to-SQL(文本轉 SQL)是自然語言處理(NLP)領域的一項重要任務,旨在將自然語言問題自動轉換為可在數據庫上執行的 SQL 查詢語句。這項技術在智能助手、數據分析工具、商業智能(BI)平臺等…

<el-cascader時只取最后一級數據

在用cascader時只取最后一級數據傳給后端 組件的屬性emitPath: false就可以做到&#xff0c;取值就是最后一級傳給后端。并且后端放回的id 也直接可以做回顯 <el-cascaderv-model"Type":options"Options":props"{ value: id, label: label, chil…

`maturin`是什么:matu rus in python

maturin是什么 maturin 是一個用于構建和發布 Rust 編寫的 Python 綁定庫的工具。它簡化了將 Rust 代碼集成到 Python 項目中的過程,支持創建不同類型的 Python 包,如純 Python 包、包含 **Rust (系統編程語言)**擴展模塊的包等。以下為你詳細介紹 maturin 的相關信息并舉例…

流媒體網絡協議全解析:從實時傳輸到自適應流,如何選擇最優方案?

一、歷史發展與協議提出者 流媒體協議的發展與互聯網技術迭代緊密相關,主要分為三個階段: 早期專有協議(1990s-2000s) RTSP/RTP 提出者:RealNetworks(RTSP初始推動者),后由IETF標準化(RFC 2326)。背景:1996年推出,用于視頻監控和點播系統,基于UDP傳輸媒體流,支持…

mysql架構查詢執行流程(圖解+描述)

目錄 mysql架構查詢執行流程 圖解 描述 mysql架構查詢執行流程 圖解 描述 用戶連接到數據庫后&#xff0c;由連接器處理 連接器負責跟客戶端建立連接、獲取權限、維持和管理連接 客戶端發送一條查詢給服務器 服務器先檢查查詢緩存&#xff0c;如果命中緩存&#xff0c;則立…

【QT問題】Ubantu環境下解決已經下載好的qt怎么添加或卸載其他組件

1、找到自己qt的安裝目錄->雙擊打開MaintenanceTool.exe 2、點擊next進去&#xff0c;此時需要登錄qt賬戶&#xff08;如果沒有去官網注冊一個&#xff0c;很快且免費&#xff09; 我這里隨便填的賬號&#xff0c;如果是正確的下面next就能夠點擊。 這里隨便提一下&#xf…

CS50 使用 Python 進行人工智能簡介-“騎士與流氓”謎題

如何使用邏輯推理來解決“騎士與騙子”&#xff08;Knights and Knaves&#xff09;類型的邏輯難題。具體來說&#xff0c;任務是根據每個角色的陳述推理出他們是“騎士”還是“騙子”。 任務背景&#xff1a; 騎士與騙子問題&#xff1a;每個角色要么是騎士&#xff0c;要么是…

每日學習Java之一萬個為什么?[MySQL面試篇]

分析SQL語句執行流程中遇到的問題 前言1 MySQL是怎么在一臺服務器上啟動的2 MySQL主庫和從庫是同時啟動保持Alive的嗎&#xff1f;3 如果不是主從怎么在啟動的時候保證數據一致性4 ACID原則在MySQL上的體現5 數據在MySQL是通過什么DTO實現的6 客戶端怎么與MySQL Server建立連接…

詳細解析d3dx9_27.dll丟失怎么辦?如何快速修復d3dx9_27.dll

運行程序時提示“d3dx9_27.dll文件缺失”&#xff0c;通常由DirectX組件損壞或文件丟失引起。此問題可通過系統化修復方法解決&#xff0c;無需重裝系統或軟件。下文將詳細說明具體步驟及注意事項。 一.d3dx9_27.dll缺失問題的本質解析 當系統提示“d3dx9_27.dll丟失”時&…

IP----訪問服務器流程

這只是IP的其中一塊內容-訪問服務器流程&#xff0c;IP還有更多內容可以查看IP專欄&#xff0c;前一段學習內容為IA內容&#xff0c;還有更多內容可以查看IA專欄&#xff0c;可通過以下路徑查看IA-----配置NAT-CSDN博客CSDN,歡迎指正 1.訪問服務器流程 1.分層 1.更利于標準化…

Linux報 “device or resource busy” 異常的原因以及解決辦法

首先&#xff0c;Linux報"device or resource busy"的原因是因為某個進程正在占用該設備或資源&#xff0c;導致其他進程無法訪問該設備或資源。 解決該問題的辦法有以下幾種&#xff1a; 查找占用該設備或資源的進程&#xff0c;然后將其停止或結束。可以使用以下…

和鯨科技推出人工智能通識課程解決方案,助力AI人才培養

2025年2月&#xff0c;教育部副部長吳巖應港澳特區政府邀請&#xff0c;率團赴港澳宣講《教育強國建設規劃綱要 (2024—2035 年)》。在港澳期間&#xff0c;吳巖闡釋了教育強國目標的任務&#xff0c;并與特區政府官員交流推進人工智能人才培養的辦法。這一系列行動體現出人工智…

java springboot 中調用 C++ 方法

以下是一個完整的 Spring Boot 調用 C 方法的 Demo&#xff0c;采用 JNI (Java Native Interface) 方式實現&#xff0c;包含詳細步驟說明&#xff1a; 1. 項目結構 demo-project/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/…

JSX基礎 —— 識別JS表達式

在JSX中可以通過 大括號語法 { } 識別JS中的表達式&#xff0c;比如常見的變量、函數調用、方法調用等等 1、使用引號傳遞字符串 2、使用JavaScript變量 3、函數調用和方法調用 (函數和方法本質沒有區別&#xff0c;這里默認&#xff1a; 函數是自己定義的&#xff0c;方法是…

git從零學起

從事了多年java開發&#xff0c;一直在用svn進行版本控制&#xff0c;如今更換了公司&#xff0c;使用的是git進行版本控制&#xff0c;所以打算記錄一下git學習的點滴&#xff0c;和大家一起分享。 百度百科&#xff1a; Git&#xff08;讀音為/g?t/&#xff09;是一個開源…

關于對async和await的初步理解

async 包裹著的函數中進程是堵塞的 &#xff0c;是同步化的&#xff0c; await等待的是個promise對象&#xff0c;否則"await" 對此表達式的類型沒有影響 例1 async getDataDD(){await this.fun1()await this.fun2()// await Promise.all([this.fun1(),this.fun…