Axios 二次封裝高級教程(含請求取消等功能)

Axios 二次封裝高級教程(含請求取消等功能)

整理不易,收藏、點贊、關注哦!


一、總體架構設計

  • 目的:構建一套功能完善、易用且健壯的 HTTP 請求封裝層

  • 核心功能

    • 請求攔截、響應攔截
    • 請求取消(防止重復請求、接口防抖)
    • 請求合并與批量處理
    • 緩存策略(內存緩存、localStorage、sessionStorage)
    • 失敗重試機制
    • 上傳下載進度監聽
    • 狀態化 hooks 集成(loading、error、data 管理)
    • 統一接口調用管理

二、Axios 實例創建與基礎配置

import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, Canceler } from 'axios'const pendingRequestMap = new Map<string, Canceler>()// 生成請求唯一key,便于取消重復請求
function getRequestKey(config: AxiosRequestConfig): string {const { method, url, params, data } = configreturn [method, url, JSON.stringify(params), JSON.stringify(data)].join('&')
}// 添加請求到pending隊列
function addPendingRequest(config: AxiosRequestConfig) {const requestKey = getRequestKey(config)if (pendingRequestMap.has(requestKey)) {// 取消重復請求pendingRequestMap.get(requestKey)?.('取消重復請求')}config.cancelToken = new axios.CancelToken((cancel) => {pendingRequestMap.set(requestKey, cancel)})
}// 移除請求
function removePendingRequest(config: AxiosRequestConfig) {const requestKey = getRequestKey(config)if (pendingRequestMap.has(requestKey)) {pendingRequestMap.delete(requestKey)}
}const service: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_API_BASE_URL,timeout: 15000,headers: {'Content-Type': 'application/json;charset=UTF-8',},
})// 請求攔截器
service.interceptors.request.use((config) => {removePendingRequest(config) // 移除之前的請求addPendingRequest(config) // 添加當前請求// 這里可以加token等鑒權信息// const token = localStorage.getItem('token')// if (token) config.headers.Authorization = `Bearer ${token}`return config},(error) => Promise.reject(error)
)// 響應攔截器
service.interceptors.response.use((response: AxiosResponse) => {removePendingRequest(response.config)// 統一處理狀態碼const { data } = responseif (data.code !== 0) {// 自定義錯誤處理return Promise.reject(new Error(data.message || 'Error'))}return data},(error) => {if (axios.isCancel(error)) {console.warn('請求被取消:', error.message)return Promise.reject({ canceled: true })}return Promise.reject(error)}
)export default service

三、請求取消與防抖(防重復請求)

  • 場景:用戶快速重復點擊按鈕,多次發送相同請求
  • 解決:通過cancelToken取消前一個重復請求,保證接口調用穩定

核心邏輯已在上面pendingRequestMap實現,結合唯一請求Key判斷。


四、多請求合并(批量接口請求)

/*** 批量請求示例* @param urls 請求地址數組*/
function batchRequest(urls: string[]) {const requests = urls.map((url) => service.get(url))return axios.all(requests).then(axios.spread((...responses) => responses))
}// 使用
batchRequest(['/api/a', '/api/b', '/api/c']).then(([resA, resB, resC]) => {console.log(resA, resB, resC)
})

五、緩存策略(內存緩存 + 本地緩存)

const cacheMap = new Map<string, any>()// 簡單緩存示例
function requestWithCache<T = any>(config: AxiosRequestConfig, useCache = true): Promise<T> {const key = getRequestKey(config)if (useCache && cacheMap.has(key)) {return Promise.resolve(cacheMap.get(key))}return service.request<T>(config).then((res) => {cacheMap.set(key, res)return res})
}
  • 可根據業務需求,擴展使用localStoragesessionStorage緩存,并設置過期時間。

六、自動失敗重試機制

interface RetryConfig extends AxiosRequestConfig {retry?: number // 重試次數retryDelay?: number // 重試間隔ms
}function retryRequest(config: RetryConfig): Promise<any> {const { retry = 3, retryDelay = 1000 } = configlet currentRetry = 0const request = (): Promise<any> => {return service.request(config).catch((error) => {if (currentRetry < retry) {currentRetry++return new Promise((resolve) => setTimeout(resolve, retryDelay)).then(request)}return Promise.reject(error)})}return request()
}
  • 可以在請求層或調用層根據需求靈活調用。

七、上傳和下載進度監聽

// 上傳進度
function uploadFile(url: string, file: File, onProgress: (percent: number) => void) {const formData = new FormData()formData.append('file', file)return service.post(url, formData, {headers: { 'Content-Type': 'multipart/form-data' },onUploadProgress: (progressEvent) => {const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total)onProgress(percent)},})
}// 下載進度
function downloadFile(url: string, onProgress: (percent: number) => void) {return service.get(url, {responseType: 'blob',onDownloadProgress: (progressEvent) => {const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total)onProgress(percent)},})
}

八、封裝狀態式 Hook(結合 Vue 3 Composition API)

import { ref } from 'vue'interface UseRequestOptions {manual?: boolean // 是否手動調用retry?: numberretryDelay?: number
}export function useRequest<T = any>(requestFn: (...args: any[]) => Promise<T>,options: UseRequestOptions = {}
) {const data = ref<T | null>(null)const loading = ref(false)const error = ref<Error | null>(null)const fetch = async (...args: any[]) => {loading.value = trueerror.value = nulltry {data.value = await requestFn(...args)loading.value = falsereturn data.value} catch (err: any) {error.value = errloading.value = falsethrow err}}if (!options.manual) {fetch()}return { data, loading, error, fetch }
}
  • 使用示例:
import { useRequest } from './useRequest'
import service from './axios'const { data, loading, error, fetch } = useRequest(() => service.get('/api/user'))

九、文件上傳并發送給后端(結合FileReader)

function uploadFileWithPreview(file: File, url: string) {return new Promise((resolve, reject) => {const reader = new FileReader()reader.readAsDataURL(file) // 讀取文件為base64編碼reader.onload = () => {// 可以先預覽file的base64,也可以直接上傳二進制const formData = new FormData()formData.append('file', file) // 直接上傳文件service.post(url, formData, {headers: { 'Content-Type': 'multipart/form-data' },}).then(resolve).catch(reject)}reader.onerror = (err) => reject(err)})
}

十、總結

  1. 請求取消通過唯一請求key + CancelToken實現,防止重復請求。
  2. 多請求合并使用axios.allaxios.spread實現批量請求并行。
  3. 緩存策略基于請求key設計內存或本地緩存,提升請求效率。
  4. 自動重試可根據失敗情況自動重試,增強請求魯棒性。
  5. 上傳/下載進度監聽靈活支持文件上傳和下載的進度反饋。
  6. 狀態式 Hook結合 Vue 3 Composition API,實現簡潔易用的請求狀態管理。
  7. 文件上傳可結合 FileReader 實現預覽和上傳雙功能。

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

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

相關文章

MobileNet V1的Pytorch實現并加載預訓練模型進行驗證

一. 環境 windonws 11RTX5060CUDA 12.8Pytorch 2.9.0dev20250630cu128torchvision 0.23.0dev20250701cu128 二. 代碼 基于Mobilenet-CustomData 的Mobilenet_Pretrain.ipynb 1. 定義Mobile Net V1 import os import time import torch import torch.nn as nn import torch…

HTTP協議利用TCP的特性來實現長連接

在討論網絡協議時,經常會有人提出這樣一個問題:“既然HTTP是基于TCP的,而TCP本身支持長連接,為什么HTTP不支持長連接?”這種說法其實是一種誤解。實際上,HTTP確實可以并且經常使用長連接(也稱為持久連接)。 什么是長連接? 首先,我們需要明確什么是“長連接”。在網…

整流電路Multisim電路仿真實驗匯總——硬件工程師筆記

目錄 1 整流電路基礎 1.1 整流電路基本原理 1.2 整流電路的類型 1.2.1 單相整流電路 1.2.2 三相整流電路 1.3 整流電路的應用 1.3.1 直流電源 1.3.2 電池充電器 1.3.3 變頻調速系統 1.34 電解和電鍍 1.4 整流電路的優缺點 1.4.1 優點 1.4.2 缺點 2 二極管整流電路…

LangChain 全面入門

什么是 LangChain&#xff1f; LangChain 是一個專門為 大語言模型 (LLM) 應用開發設計的開源框架&#xff0c;幫你快速實現&#xff1a; ? 多輪對話 ? 知識庫問答 (RAG) ? 多工具協同調用 (function calling / tool) ? 智能體 Agent 自動決策任務鏈 解耦 LLM 接口、Prom…

RabbitMQ 高級特性之消息確認

1. 簡介 RabbitMQ 的消息發送流程&#xff1a; producer 將消息發送給 broker&#xff0c;consumer 從 broker 中獲取消息并消費 那么在這里就涉及到了兩種消息發送&#xff0c;即 producer 與 broker 之間和 consumer 與 broker 之間。 “消息確認” 討論的是 consumer 與…

【51單片機用數碼管顯示流水燈的種類是按鈕控制數碼管加一和流水燈】2022-6-14

緣由 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共陰0~F消隱減號 unsigned char Js0, miao0;//中斷計時 秒 分 時 毫秒 sbit k0P3^0; sbit k1P3^1; void smxs(u…

Android15 開機動畫播放結束之后如何直接啟動應用

問題背景 軟件版本:Android15 在一些需求場景里面,需要開機動畫播放結束立馬去啟動一個應用,下面介紹如何實現這種方案。 解決方案 首選我們需要知道開機動畫播放結束之后的流程,這里會調用到wms里面,也就是一些enableScreen之類的函數,知道這個大概流程之后,再去對應…

AI實踐:大模型痛點和解決方案討論

大家好&#xff0c;我是星野&#xff0c;歡迎來到我的CSDN博客。在這個技術日新月異的時代&#xff0c;我們一起學習&#xff0c;共同進步。 今天想和大家分享的是大模型在實際應用中的痛點以及解決方案&#xff0c;特別是RAG&#xff08;檢索增強生成&#xff09;技術。 大模…

Web前端工程化

Web前端工程化 前端工程化是指將軟件工程的方法和原則應用到前端開發中&#xff0c;以提高開發效率、保證代碼質量、便于團隊協作和項目維護的一套體系化實踐。以下是前端工程化的主要內容和實踐&#xff1a; 核心組成部分 1. 模塊化開發 JavaScript模塊化&#xff1a;Comm…

Java 原生 HTTP Client

?介紹 Java 原生 HttpClient 是從 Java 11 開始引入的標準庫&#xff0c;用于簡化 HTTP 請求的發送與響應處理。它支持同步和異步請求&#xff0c;并內置對 HTTP/1.1 和 HTTP/2 協議的支持。HttpClient 提供了易用的 API 來設置請求頭、請求體、處理響應以及配置 SSL/TLS 加密…

【C語言刷題】第十天:加量加餐繼續,代碼題訓練,融會貫通IO模式

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 &#x1f349;學習方向&#xff1a;C/C方向 ??人生格言&#xff1a;為天地立心&#xff0c;為生民立命&#xff0c;為…

【WEB】Polar靶場 6-10題 詳細筆記

六.jwt 這題我又不會寫 先來了解下jwt **JWT&#xff08;JSON Web Token&#xff09;**是一種基于JSON的開放標準&#xff08;RFC 7519&#xff09;&#xff0c;主要用于在網絡應用環境間傳遞聲明信息。JWT通常用于身份驗證和信息交換&#xff0c;確保在各方之間安全地傳輸信…

高階亞馬遜運營秘籍:關鍵詞矩陣打法深度解析與應用

當競爭對手還在為單個大詞競價廝殺時&#xff0c;頭部賣家已悄然構建了一張覆蓋數千長尾關鍵詞的隱形網絡&#xff0c;精準觸達每一個細分需求&#xff0c;以更低的成本撬動更高的轉化率在亞馬遜流量紅利消退、廣告成本高企的2025年&#xff0c;傳統“爆款關鍵詞”打法已顯疲態…

【問題解決】org.springframework.web.util.NestedServletException Handler dispatch failed;

詳細異常信息&#xff1a; org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at org.springframework.web.servlet.DispatcherServlet.doDispatch(Disp…

【已解決】mac 聚焦搜索設置了edge 的地址欄搜索為google,還是跳轉到百度

問題詳情&#xff1a;在macbook的聚焦搜索中點擊edge搜索的時候&#xff0c;跳轉到了百度&#xff0c;即使已經將地址欄的搜索引擎設置為了goole&#xff0c;但是還是會跳轉到百度。解決方案&#xff1a;1、打開safari瀏覽器。&#xff08;看清了&#xff0c;是打開Safari&…

MimicMotion 讓你的圖片動起來

MimicMotion 是由騰訊公司推出的一款人工智能人像動態視頻生成框架。可以模仿視頻動作再讓圖片模仿動作姿態&#xff0c;最后生成視頻。 MimicMotion 的核心在于其置信度感知的姿態引導技術&#xff0c;確保視頻幀的高質量和時間上的平滑過渡。 以前咱們也手搭過Animate-X讓圖…

云計算考核 - 分析電子銀行需求采用微服務架構對系統進行設計

二、使用的技術以及分析 微服務&#xff08;Microservices&#xff09;是一種架構風格&#xff0c;一個大型復雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署&#xff0c;各個微服務之間是松耦合的。每個微服務僅關注于完成一件任務并很好地完成該任務。在…

Ionic 安裝使用教程

一、Ionic 簡介 Ionic 是一個基于 Web 技術&#xff08;HTML、CSS、JavaScript&#xff09;的跨平臺移動應用開發框架&#xff0c;結合 Angular、React 或 Vue 可快速構建 iOS 和 Android 應用。Ionic 提供豐富的 UI 組件、命令行工具及原生插件封裝&#xff0c;廣泛用于混合應…

滲透測試 - 簡介

Web滲透測試簡介 Web滲透測試&#xff08;Penetration Testing&#xff09;是一種模擬黑客攻擊的安全評估方法&#xff0c;旨在發現Web應用程序中的漏洞&#xff0c;幫助開發者修復問題并提升系統安全性。它涉及主動測試目標系統&#xff08;如網站或API&#xff09;的弱點&am…

云原生AI研發體系建設路徑

當AI遇上云原生&#xff0c;就像咖啡遇上牛奶&#xff0c;總能擦出不一樣的火花 ?? &#x1f4cb; 文章目錄 引言&#xff1a;為什么要建設云原生AI研發體系整體架構設計&#xff1a;搭建AI研發的"樂高積木"技術棧選擇&#xff1a;選擇合適的"武器裝備"…