Axios封裝以及添加攔截器

? ? ?在前端開發中,http請求層的封裝可以極大提升代碼的復用性和可維護性,本文將完整的用axios封裝接口請求,配置請求與響應攔截器,封裝統一的請求方法全過程。

? ?封裝的目的和思路

? ? ? ? 在項目直接用axios發送請求當然沒問題,但是如果不做封裝,每個請求都需要手動處理token,錯誤提示等邏輯,容易重復,缺乏統一的loading處理邏輯,不同組件可以用不一致的方式調用axios增加維護成本。業務錯誤,比如登錄失敗權限不足不集中處理用戶體驗差。

? ? ? ? 所以我們統一封裝是為了實現這些目標。

? ? ? ? 1.封裝Axios實例+設置baseURL和超時。

? ? ? ? 2.添加請求攔截器:自動加token顯示Loading

? ? ? ? 3.添加響應攔截器 統一處理錯誤隱藏loading

? ? ? ? 4 暴露統一的get/post等請求方法

? ? ? ? 5.支持類型推導(泛型)

? ? ? step1:安裝Axios

? ? ? ? npm install axios?

? ? ?step2:創建Axios實例并且封裝基礎配置

// api/request.ts
import axios, { AxiosError } from 'axios'
import { message } from 'antd'
import { showLoading, hideLoading } from './loading'const instance = axios.create({baseURL: '/api',                 // 接口統一前綴timeout: 8000,                   // 超時時間timeoutErrorMessage: '請求超時,請稍后再試',withCredentials: false,          // 是否攜帶 Cookie
})

為什么要用 axios.create?

可以創建多個實例,分別管理不同的 baseURL(如主站與后臺接口)。

不影響全局 axios,互不干擾。

step3:請求攔截器

instance.interceptors.request.use((config) => {showLoading()const token = localStorage.getItem('token')if (token) {config.headers.Authorization = 'Token::' + token}return { ...config }},(error: AxiosError) => {return Promise.reject(error)}
)

?請求攔截器做了什么?

? ? ? ? 1.請求前顯示 loading(配合 Ant Design 的 Spin)

? ? ? ? 2.自動從 localStorage 中讀取 token,統一加入到請求頭中?

? ? ? ? 3.你也可以添加其他自定義 headers,例如用戶 ID、語言偏好等

step4:響應攔截器--統一 錯誤處理以及成功返回data

????????

instance.interceptors.response.use((response) => {hideLoading()const data = response.dataif (data.code === 500001) {// 登錄失效message.error(data.msg || '身份已過期,請重新登錄')localStorage.removeItem('token')return Promise.reject(data)} else if (data.code !== 0) {// 業務錯誤message.error(data.msg || '請求錯誤,請稍后重試')return Promise.reject(data)}return data.data // 請求成功,返回業務數據},(error: AxiosError) => {hideLoading()message.error(error.message || '服務器異常,請稍后重試')return Promise.reject(error)}
)

??

? ? ? ? 攔截器可能有人不理解概念。這里把概念放在這里。

????????axios.interceptors.request.use 是 Axios 提供的 API,用來設置請求發出前的統一處理邏輯。

它接收兩個回調函數,第一個是處理請求體 config 的,我們通常在這里加上 token、顯示 loading,處理完之后必須返回 config 否則請求會被中斷。

????????第二個是請求配置階段發生錯誤時的處理函數,比如攔截器中拋出異常,這個函數里我們一般把錯誤通過 Promise.reject 拋出去,供 .catch 捕獲使用。

????????Axios 的響應攔截器也接收兩個回調函數,第一個是響應成功時調用,它的參數是 response,從中我們可以提取 response.data,然后判斷自定義的 code 字段,來決定是 token 過期、業務出錯還是成功。如果 token 過期或失敗,會彈出錯誤提示,并通過 Promise.reject 拋出錯誤。

????????第二個回調函數是響應失敗(如網絡錯誤、404、500)時觸發的,我們可以統一顯示“服務器異常”等提示,也用 Promise.reject 拋出錯誤,供組件用 .catch() 捕獲。

? ? 后端返回的 data 結構通常如下:

{

"code": 0,

"msg": "成功",

"data": { "userInfo": { ... } }

}

? ? ? ? ?然后我們就可以明顯看到我們請求攔截器實際上就是config這個請求體在發送之前我們去加一些邏輯去處理我們的config請求體。比如頭部加上Authorization屬性值為token把我們的token加上去。還有第二個回調函數,就是把錯誤作為Promise實例的reject(error)扔出去,這樣我們組件可以用.catch捕捉。

? ? ? ? 響應攔截器同理,response就是我們的響應體。我們響應體在到組件接收之前我們對響應體做一些處理,比如我們不需要響應體,我們只是想要里面的data.data那么成功就返回data.data如果token過期了久調用message這是個組件然后.error顯示錯誤比如token過期了。總之只要有響應體一定會返回data給到我們的組件。如果響應攔截的時候就發現報錯了那么就reject扔出error組件.catch捕獲。

step5:封裝統一請求方法(泛型)

export default {get<T>(url: string, params?: object): Promise<T> {return instance.get(url, { params })},post<T>(url: string, params?: object): Promise<T> {return instance.post(url, params)},// 后續可添加 put、delete 等
}

?????

為什么要用泛型 <T>

  • 調用接口時能獲得接口返回值的類型提示,增強類型安全

  • 調用時直接寫 const res = await api.get<YourType>(...)

step6:如何使用封裝后的請求

// api/user.ts
import request from './request'export const getUserInfo = () => {return request.get<{ name: string; age: number }>('/user/info')
}

? ? ? ? 通過引入對象的形式直接調用里面的方法就可以了,然后聲明泛型也就是我們如果需要返回值的話聲明返回值的類型。然后后面是傳過去的url訪問的接口。實際上訪問的地址是baseUrl+我們傳過去的url。

? ? ? ? 總結

?????????

?????????

?

?

?

?

????????

?

?

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

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

相關文章

C語言中奇技淫巧04-僅對指定函數啟用編譯優化

相信很多人使用GCC編譯代碼時&#xff0c;都會接觸到gcc -O0/1/2/3/s&#xff0c;知道它可以對工程進行全局優化。 事實上&#xff0c;除了全局優化外&#xff0c;使用GCC擴展方式&#xff0c;我們還可以僅對部分關鍵函數實施差異化編譯優化。 在GCC編譯器中&#xff0c;attrib…

HTML Style 對象深度解析:從基礎到高級應用

一、Style 對象的核心概念定義與作用 Style 對象是 HTML DOM 中用于操作元素內聯樣式的接口&#xff0c;通過 element.style 訪問。它允許動態修改元素的 CSS 屬性&#xff0c;但僅能直接影響內聯樣式&#xff08;即通過 style 屬性直接寫在標簽中的樣式&#xff09;。與外部樣…

【C++】定義常量

在 C 中&#xff0c;有兩種簡單的定義常量的方式&#xff1a; 使用 #define 預處理器。使用 const 關鍵字。 #define 預處理器 #include <iostream> using namespace std;#define LENGTH 10 #define WIDTH 5 #define NEWLINE \nint main() {int area; area LENGTH …

基于遺傳算法的多無人車協同偵察與安全保護策略優化

基于遺傳算法的多無人車協同偵察與安全保護策略優化 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 1. 引言 1.1 研究背景與意義 隨著無人系統技術的快速發…

python面向對象編程詳解

面向對象編程&#xff08;OOP&#xff09;是一種以對象為核心的編程范式。Python全面支持OOP&#xff0c;主要包含以下核心概念&#xff1a;一、類與對象1.類(Class)類是創建對象的模板或藍圖&#xff0c;它定義了對象的屬性和方法。class Dog:# 類屬性&#xff08;所有實例共享…

快速入門Socket編程——封裝一套便捷的Socket編程——導論

快速入門Socket編程——封裝一套便捷的Socket編程——導論 前言 ? 這里是筆者打算做的Socket編程的第二部分&#xff0c;也就是核心的討論我們Socket編程本身。 導論 ? 我們知道&#xff0c;一個經典的服務器套接字的處理流程是如下的&#xff1a; 創建一個指定傳輸層和網絡層…

【Mermaid 離線工具】Mermaid 流程圖生成器 - 高清PNG輸出,一鍵生成專業級流程圖!

文章目錄 Mermaid 流程圖生成器(離線版本):高效繪圖,離線也能玩轉專業可視化 一、Mermaid:文本繪圖的 “魔法語法” 二、離線版生成器:功能與優勢解析 (一)離線可用,場景更靈活 (二)操作流程:簡單五步,產出專業圖表 (三)界面設計:簡潔直觀,降低使用門檻 三、應…

haproxy原理及實戰部署

一、負載均衡 負載均衡是網絡架構和分布式系統中至關重要的技術&#xff0c;其核心作用是將大量的并發請求或數據流量合理分配到多個服務器&#xff08;或其他資源節點&#xff09;上&#xff0c;從而解決單節點壓力過大、資源利用率低、系統穩定性差等問題。 作用1. 提高系統吞…

jwt 在net9.0中做身份認證

一、新建net9.0項目WebApplication1&#xff0c;安裝包 <ItemGroup><PackageReference Include"Microsoft.AspNetCore.Authentication.JwtBearer" Version"9.0.7" /><PackageReference Include"Swashbuckle.AspNetCore" Version&…

【機器學習深度學習】微調能改變模型“智商”嗎?——模型能力與知識的本質解析

目錄 前言 一、模型的“知識”與“能力”&#xff1a;兩種不同的智能 第一種&#xff1a;淺層知識&#xff08;記憶 模式識別&#xff09; 第二種&#xff1a;深層能力&#xff08;推理 理解&#xff09; 二、微調&#xff1a;改變的是“經歷”&#xff0c;不是“天賦”…

oracle數據庫表空間碎片整理

oracle數據庫表空間碎片整理 表空間碎片情況檢查 表空間碎片問題處理 收縮表 表空間手動整理 exp/imp導出再導入 移動表到新的表空間 表空間碎片情況檢查 對比表實際使用空間和數據文件占用空間: --實際數據占用空間 select tablespace_name,round(sum(bytes/1024/1024/1024…

為什么需要可重入鎖

在黑馬點評項目實戰中&#xff0c;提到了可重入鎖&#xff0c;然后我想到了是不是不同業務在同一線程內反復獲取同一把鎖。本文來討論一下為什么鎖需要可重入。一、可重入鎖的核心&#xff1a;“同一線程多次獲取同一把鎖”??可重入&#xff08;Reentrant&#xff09;?? 的…

【AI】聯網模式

【AI】聯網模式 文章目錄【AI】聯網模式1. 簡介2. 接入步驟2.1 引入依賴2.2 方法構建2.3 接口構建1. 簡介 在使用聯網模式之前&#xff0c;我們如果問起ai一些最近網絡上流傳的一些東西&#xff0c;它可能并不能準確的給你描述出來&#xff0c;因為它的知識庫更新時間可能停留…

第10篇:實戰驗收篇

&#x1f50d; 實戰演練&#xff1a;多條件房源查詢 需求描述 查找一套符合以下條件的房子&#xff1a; 預算&#xff1a;2000–3000元區域&#xff1a;天河區戶型&#xff1a;兩房 關鍵詞&#xff1a;多條件查詢 AND BETWEEN LIKE 組合運用&#x1f3ac; 開場白“聽起來不難&a…

深入解析YARN中的FairScheduler與CapacityScheduler:資源分配策略的核心區別

YARN資源調度器概述在Hadoop生態系統中&#xff0c;YARN&#xff08;Yet Another Resource Negotiator&#xff09;作為核心資源管理平臺&#xff0c;其架構設計將計算資源管理與作業調度解耦&#xff0c;形成了"全局資源管理器&#xff08;ResourceManager&#xff09;節…

基于Seata的微服務分布式事務實戰經驗分享

基于Seata的微服務分布式事務實戰經驗分享 1. 業務場景描述 在電商系統中&#xff0c;用戶下單會涉及多個微服務&#xff1a;訂單服務&#xff08;Order Service&#xff09;、庫存服務&#xff08;Inventory Service&#xff09;、賬戶服務&#xff08;Account Service&#x…

Linux庫——庫的制作和原理(2)_庫的原理

文章目錄庫的原理理解目標文件ELF文件讀取ELF的工具——readelfELF從形成到加載的輪廓ELF形成可執行文件ELF可執行的加載理解鏈接與加載靜態鏈接ELF加載和進程地址空間虛擬地址 & 邏輯地址重新理解進程地址空間動態鏈接和動態庫的加載進程如何找到動態庫多個進程之間如何共…

Redis C++客戶端——通用命令

目錄 代碼案例 get和set部分 exists部分 del部分 keys部分 expire部分 type部分 本篇文章主要是通過redis-plus-plus庫使用通用命令。 代碼案例 下面用一個代碼演示&#xff1a; #include <sw/redis/redis.h> #include <iostream> #include <vecto…

手機開啟16k Page Size

我買了一個pixel8的手機&#xff0c;系統是Android16,如下操作都是基于這個手機做的。 https://source.android.com/docs/core/architecture/16kb-page-size/16kb-developer-option?hlzh-cn#use_16kb_toggle 使用 16 KB 切換開關 按照開發者選項文檔中的指示啟用開發者選項。…

VLAN的劃分(基于華為eNSP)

VLAN的劃分 前言&#xff1a;為什么VLAN是現代網絡的“隱形骨架”&#xff1f; 當一臺辦公室電腦發送文件給隔壁工位的同事時&#xff0c;數據如何精準抵達目標而不“打擾”其他設備&#xff1f;當企業財務部的敏感數據在網絡中傳輸時&#xff0c;如何避免被其他部門的設備“窺…