HOW - Axios 攔截器特性

目錄

  • Axios 介紹
  • 攔截器特性
    • 1. 統一添加 Token(請求攔截器)
    • 2. 處理 401 未授權(響應攔截器)
    • 3. 統一處理錯誤信息(響應攔截器)
    • 4. 請求 Loading 狀態管理
    • 5. 自動重試請求(如 429 過載)
    • 6. 數據格式轉換(響應攔截器)
    • 7. 記錄請求日志(請求攔截器 + 響應攔截器)
    • 總結
    • 結論

Axios 介紹

Axios 是基于 XMLHttpRequest(XHR)Promise 進行封裝的 HTTP 客戶端。

它的核心實現依賴于以下技術:

  1. XMLHttpRequest(XHR)

    • 在瀏覽器環境下,Axios 使用 XMLHttpRequest 發送 HTTP 請求,并基于它進行封裝,提供更簡潔的 API 和更好的錯誤處理機制。
    • 例如,它支持請求和響應的攔截器、超時設置、請求取消等功能,而這些都需要額外的封裝才能在 XMLHttpRequest 中實現。
  2. Node.js 的 http 模塊

    • 在 Node.js 環境下,Axios 使用 httphttps 模塊代替 XMLHttpRequest 發送 HTTP 請求,從而實現跨環境的兼容性。
  3. Promise

    • Axios 的 API 是基于 Promise 設計的,所有請求都會返回一個 Promise,支持 async/await,比傳統的 XMLHttpRequest 更加方便。
  4. 攔截器(Interceptors)

    • 通過 requestresponse 攔截器,Axios 允許在請求或響應到達應用程序之前,對其進行修改,比如添加請求頭、處理錯誤、全局 loading 等。
  5. 取消請求(Cancel Token)

    • 依賴 AbortController 或者 CancelToken(Axios 0.x 版本提供),可以在特定條件下取消未完成的 HTTP 請求。
  6. 自動 JSON 解析

    • Axios 默認會將 JSON 響應數據自動解析成 JavaScript 對象,而 XMLHttpRequest 需要手動解析。
  7. 并發請求管理

    • 通過 axios.all()axios.spread(),支持并行發送多個請求,并在所有請求完成后進行處理。

總結來說,Axios 的底層實現主要基于 XMLHttpRequest(瀏覽器端)或 Node.js http 模塊(服務端),同時結合 Promise、攔截器、取消請求等高級特性,提供了比原生 API 更易用的 HTTP 請求功能。

攔截器特性

Axios 攔截器(Interceptors)可以在請求發送前或響應返回后進行處理,常用于全局請求配置、錯誤處理、權限校驗、自動重試等場景。以下是幾個實際應用示例:

1. 統一添加 Token(請求攔截器)

場景:
需要在所有請求的 headers 中添加 Authorization 頭部,例如 JWT Token。

import axios from "axios";// 創建 axios 實例
const api = axios.create({baseURL: "https://api.example.com",timeout: 5000,
});// 請求攔截器
api.interceptors.request.use(config => {const token = localStorage.getItem("token"); // 從本地存儲獲取 tokenif (token) {config.headers.Authorization = `Bearer ${token}`; // 設置 Authorization 頭部}return config;},error => Promise.reject(error)
);// 使用 axios 實例
api.get("/user/profile").then(response => console.log(response.data));

📌 效果:

  • 所有請求都會自動附帶 Authorization 頭部,避免手動在每個請求中添加。

2. 處理 401 未授權(響應攔截器)

場景:
當后端返回 401 Unauthorized,表示 Token 失效,應該自動跳轉到登錄頁。

api.interceptors.response.use(response => response,error => {if (error.response?.status === 401) {console.error("身份認證失敗,跳轉到登錄頁...");window.location.href = "/login"; // 重定向到登錄頁面}return Promise.reject(error);}
);

📌 效果:

  • 如果請求返回 401,用戶會被自動跳轉到登錄頁,而不會繼續執行后續邏輯。

3. 統一處理錯誤信息(響應攔截器)

場景:
后端返回錯誤時,攔截器可以解析 error.response.data,并彈出錯誤提示。

import { message } from "antd"; // 適用于 Ant Design 的 message 組件api.interceptors.response.use(response => response,error => {if (error.response) {const { status, data } = error.response;const errorMsg = data.message || "服務器錯誤";message.error(`請求失敗 (${status}): ${errorMsg}`);} else {message.error("網絡異常,請檢查你的連接");}return Promise.reject(error);}
);

📌 效果:

  • 400、500 等錯誤時,自動彈出友好的錯誤提示。

4. 請求 Loading 狀態管理

場景:
在請求發起時顯示 Loading 狀態,請求結束后自動隱藏。

import { message } from "antd";let requestCount = 0;function showLoading() {if (requestCount === 0) {message.loading("加載中...", 0);}requestCount++;
}function hideLoading() {requestCount--;if (requestCount === 0) {message.destroy(); // 關閉 loading}
}// 請求攔截器:增加 Loading
api.interceptors.request.use(config => {showLoading();return config;
});// 響應攔截器:移除 Loading
api.interceptors.response.use(response => {hideLoading();return response;},error => {hideLoading();return Promise.reject(error);}
);

📌 效果:

  • 多個請求時,只顯示一個 Loading,所有請求完成后才關閉。

5. 自動重試請求(如 429 過載)

場景:
如果服務器返回 429 Too Many Requests,可以實現自動重試,避免短時間內請求失敗。

api.interceptors.response.use(response => response,async error => {const { response, config } = error;if (response?.status === 429 && !config.__isRetryRequest) {config.__isRetryRequest = true;console.warn("請求過載,2 秒后重試...");await new Promise(resolve => setTimeout(resolve, 2000));return api(config); // 重新請求}return Promise.reject(error);}
);

📌 效果:

  • 如果服務器返回 429,攔截器會等待 2 秒后自動重試一次。

6. 數據格式轉換(響應攔截器)

場景:
后端返回的數據格式不符合前端要求,需要在攔截器中轉換。

api.interceptors.response.use(response => {if (response.data && response.data.result) {return response.data.result; // 提取需要的 `result` 數據}return response.data;
});

📌 效果:

  • 假設后端返回 { success: true, result: { name: "Tom" } },前端直接拿到 { name: "Tom" }

7. 記錄請求日志(請求攔截器 + 響應攔截器)

場景:
在開發模式下,打印請求和響應日志,方便調試。

api.interceptors.request.use(config => {console.log("🚀 請求:", config.method?.toUpperCase(), config.url, config.data);return config;
});api.interceptors.response.use(response => {console.log("? 響應:", response.config.url, response.data);return response;},error => {console.error("? 請求失敗:", error.config?.url, error.response?.status);return Promise.reject(error);}
);

📌 效果:

  • 在開發者工具控制臺中,能看到請求和響應的日志信息,方便調試。

總結

攔截器類型應用場景**示例代碼
請求攔截器統一添加 Tokenconfig.headers.Authorization = Bearer ${token}
請求攔截器全局 Loading 處理showLoading()hideLoading()
響應攔截器處理 401 未授權if (error.response.status === 401) { window.location.href = "/login"; }
響應攔截器統一錯誤提示message.error(error.response.data.message);
響應攔截器處理 429 過載自動重試await new Promise(resolve => setTimeout(resolve, 2000)); return api(config);
響應攔截器數據格式轉換return response.data.result;
攔截器請求 & 響應日志console.log("🚀 請求:", config)

結論

Axios 攔截器非常強大,能幫助我們在全局范圍內 統一管理請求和響應,減少重復代碼,提升可維護性。實際項目中,可以根據需求選擇合適的攔截器組合,提升開發效率!

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

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

相關文章

JVM核心機制:類加載×字節碼引擎×垃圾回收機制

🚀前言 “為什么你的Spring應用啟動慢?為什么GC總是突然卡頓?答案藏在JVM的核心機制里! 本文將用全流程圖解字節碼案例,帶你穿透三大核心機制: 類加載:雙親委派如何防止惡意代碼入侵&#xff…

coze生成流程圖和思維導圖工作流

需求:通過coze平臺實現生成流程圖和思維導圖,要求支持文檔上傳 最終工作流如下: 入參: 整合用戶需求文件內容的工作流:https://blog.csdn.net/YXWik/article/details/147040071 選擇器分發,不同的類型走…

網絡安全應急響應-文件痕跡排查

在Windows系統的網絡安全應急響應中&#xff0c;文件痕跡排查是識別攻擊行為的關鍵步驟。以下是針對敏感目錄的詳細排查指南及擴展建議&#xff1a; 1. 臨時目錄排查&#xff08;Temp/Tmp&#xff09; 路徑示例&#xff1a; C:\Windows\TempC:\Users\<用戶名>\AppData\L…

SpringBoot集成Redis 靈活使用 TypedTuple 和 DefaultTypedTuple 實現 Redis ZSet 的復雜操作

以下是 Spring Boot 集成 Redis 中 TypedTuple 和 DefaultTypedTuple 的詳細使用說明&#xff0c;包含代碼示例和場景說明&#xff1a; 1. 什么是 TypedTuple 和 DefaultTypedTuple&#xff1f; TypedTuple<T> 接口&#xff1a; 定義了 Redis 中有序集合&#xff08;ZSet…

遞歸實現組合型枚舉(DFS)

從 1~n 這 n 個整數中隨機選出 m 個&#xff0c;輸出所有可能的選擇方案。 輸入格式 兩個整數 n,m,在同一行用空格隔開。 輸出格式 按照從小到大的順序輸出所有方案&#xff0c;每行 1 個。 首先&#xff0c;同一行內的數升序排列&#xff0c;相鄰兩個數用一個空格隔開。…

CentOS 7 鏡像源失效解決方案(2025年)

執行 yum update 報錯&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加載插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…

vue3 腳手架初始化項目生成文件的介紹

文章目錄 一、介紹二、舉例說明1.src/http/index.js2.src/router/index.js3.src/router/routes.js4.src/stores/index.js5.src/App.vue6.src/main.js7.babel.config.js8.jsconfig.json9.vue.config.js10. .env11.src/mock/index.js12.src/mock/mock-i18n.js13.src/locales/en.j…

ubuntu 20.04 編譯和運行A-LOAM

1.搭建文件目錄和clone代碼 mkdir -p A-LOAM/src cd A-LOAM/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM cd .. 2.修改代碼文件 2.1 由于PCL版本1.10&#xff0c;將CMakeLists.txt中的C標準改為14&#xff1a; set(CMAKE_CXX_FLAGS "-stdc14"…

【教程】MacBook 安裝 VSCode 并連接遠程服務器

目錄 需求步驟問題處理 需求 在 Mac 上安裝 VSCode&#xff0c;并連接跳板機和服務器。 步驟 Step1&#xff1a;從VSCode官網&#xff08;https://code.visualstudio.com/download&#xff09;下載安裝包&#xff1a; Step2&#xff1a;下載完成之后&#xff0c;直接雙擊就能…

LabVIEW 長期項目開發

LabVIEW 憑借其圖形化編程的獨特優勢&#xff0c;在工業自動化、測試測量等領域得到了廣泛應用。對于長期運行、持續迭代的 LabVIEW 項目而言&#xff0c;其開發過程涵蓋架構設計、代碼管理、性能優化等多個關鍵環節&#xff0c;每個環節都對項目的成功起著至關重要的作用。下面…

用matlab搭建一個簡單的圖像分類網絡

文章目錄 1、數據集準備2、網絡搭建3、訓練網絡4、測試神經網絡5、進行預測6、完整代碼 1、數據集準備 首先準備一個包含十個數字文件夾的DigitsData&#xff0c;每個數字文件夾里包含1000張對應這個數字的圖片&#xff0c;圖片的尺寸都是 28281 像素的&#xff0c;如下圖所示…

Go 語言語法精講:從 Java 開發者的視角全面掌握

《Go 語言語法精講&#xff1a;從 Java 開發者的視角全面掌握》 一、引言1.1 為什么選擇 Go&#xff1f;1.2 適合 Java 開發者的原因1.3 本文目標 二、Go 語言環境搭建2.1 安裝 Go2.2 推薦 IDE2.3 第一個 Go 程序 三、Go 語言基礎語法3.1 變量與常量3.1.1 聲明變量3.1.2 常量定…

如何選擇優質的安全工具柜:材質、結構與功能的考量

在工業生產和實驗室環境中&#xff0c;安全工具柜是必不可少的設備。它不僅承擔著工具的存儲任務&#xff0c;還直接影響工作環境的安全和效率。那么&#xff0c;如何選擇一個優質的安全工具柜呢&#xff1f;關鍵在于對材質、結構和功能的考量。 01材質&#xff1a;耐用與防腐 …

系統與網絡安全------Windows系統安全(11)

資料整理于網絡資料、書本資料、AI&#xff0c;僅供個人學習參考。 制作U啟動盤 U啟動程序 下載制作U啟程序 Ventoy是一個制作可啟動U盤的開源工具&#xff0c;只需要把ISO等類型的文件拷貝到U盤里面就可以啟動了 同時支持x86LegacyBIOS、x86_64UEFI模式。 支持Windows、L…

【5】搭建k8s集群系列(二進制部署)之安裝master節點組件(kube-controller-manager)

注&#xff1a;承接專欄上一篇文章 一、創建配置文件 cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF KUBE_CONTROLLER_MANAGER_OPTS"--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-electtrue \\ --kubeconfig/op…

C#里第一個WPF程序

WPF程序對界面進行優化,但是比WINFORMS的程序要復雜很多, 并且界面UI基本上不適合拖放,所以需要比較多的時間來布局界面, 產且需要開發人員編寫更多的代碼。 即使如此,在面對誘人的界面表現, 隨著客戶對界面的需求提高,還是需要采用這樣的方式來實現。 界面的樣式采…

createContext+useContext+useReducer組合管理React復雜狀態

createContext、useContext 和 useReducer 的組合是 React 中管理全局狀態的一種常見模式。這種模式非常適合在不引入第三方狀態管理庫&#xff08;如 Redux&#xff09;的情況下&#xff0c;管理復雜的全局狀態。 以下是一個經典的例子&#xff0c;展示如何使用 createContex…

記一次常規的網絡安全滲透測試

目錄&#xff1a; 前言 互聯網突破 第一層內網 第二層內網 總結 前言 上個月根據領導安排&#xff0c;需要到本市一家電視臺進行網絡安全評估測試。通過對內外網進行滲透測試&#xff0c;網絡和安全設備的使用和部署情況&#xff0c;以及網絡安全規章流程出具安全評估報告。本…

el-table,新增、復制數據后,之前的勾選狀態丟失

需要考慮是否為 更新數據的方式不對 如果新增數據的方式是直接替換原數據數組&#xff0c;而不是通過正確的響應式數據更新方式&#xff08;如使用 Vue 的 this.$set 等方法 &#xff09;&#xff0c;也可能導致勾選狀態丟失。 因為 Vue 依賴數據的響應式變化來準確更新視圖和…

第15屆藍橋杯java-c組省賽真題

目錄 一.拼正方形 1.題目 2.思路 3.代碼 二.勁舞團 1.題目 2.思路 3.代碼 三.數組詩意 1.題目 2.思路 3.代碼 四.封閉圖形個數 1.題目 2.思路 3.代碼 五.吊墜 1.題目 六.商品庫存管理 1.題目 2.思路 3.代碼 七.挖礦 1.題目 2.思路 3.代碼 八.回文字…