TypeScript項目中Axios的封裝

目錄

前言

一、axios中的常見類型

1. AxiosInstance

2. AxiosRequestConfig

3. AxiosResponse

4. AxiosError

二、axios封裝步驟

三、封裝后的完整代碼

1. 基礎封裝

2. 高級封裝


前言

為了實現統一的網絡請求處理和管理,在日常開發中我們常常封裝 axios,來實現統一配置、設置請求攔截器和響應攔截器、錯誤處理等。

TypeScript可以給項目提供類型檢查和類型推導,axios請求回來的數據也會受其檢查。本文將提供axios結合ts寫法的封裝步驟和代碼。

一、axios中的常見類型

1. AxiosInstance

表示axios請求的配置選項,包括URL、方法、頭部、參數等。

2. AxiosRequestConfig

表示一個axios實例的類型,可以用于創建自定義配置的axios實例。

3. AxiosResponse

表示axios響應的數據結構,包括狀態碼、響應頭和響應數據。

4. AxiosError

表示axios請求發生錯誤時的錯誤對象,包括錯誤消息、請求配置和響應信息(如果有)。

注意:如果沒有跟類型,ts也會自動推到成相應類型。可以不寫,但不能錯寫。

二、axios封裝步驟

1.?安裝依賴

在項目根目錄下,使用 npm 或 yarn 命令安裝 axios 和 @types/axios(用于提供 axios 的類型定義文件)

pnpm install axios @types/axios

2.?創建封裝文件

在項目中創建一個新的文件,例如 request.ts,用于封裝 axios。可以根據項目需求結構化地組織這些文件。文件名根據個人習慣來,大都取 axios 、request 、http等。

3.?導入 axios

request.ts?文件中導入 axios 模塊。

4. 添加默認配置

根據需要,在請求方法中設置默認的請求頭、超時時間、響應數據格式等配置項。

5. 定義返回的數據類型

根據后端返回的數據,設置統一的請求結果接口。

6.?添加攔截器

如果需要使用攔截器,可以在 api.ts 文件中定義請求攔截器和響應攔截器,并注冊到 axios 中。

7. 封裝請求方法

根據項目需求,定義請求方法,例如 GET、POST、PUT、DELETE 等。可以使用泛型來指定請求和響應的數據類型,增加類型安全性。

8.?導出方法/實例

在?request.ts?文件末尾,將封裝的請求方法進行導出。

三、封裝后的完整代碼

1. 基礎封裝

使用對象字面量方式創建一個單例的axios實例。

// 導入axios和所需的類型
import axios, { AxiosInstance, AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios'// 默認配置
const service: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_API_BASE || '/' // 設置API的基本URL,默認為根路徑
})// 請求攔截器,對請求配置進行一些處理或設置
service.interceptors.request.use((config: InternalAxiosRequestConfig) => {return config},(error: AxiosError) => {return Promise.reject(error)}
)// 響應攔截器,對響應結果進行處理或判斷
service.interceptors.response.use((response: AxiosResponse) => {if (response.status === 200) {return response.data}return Promise.reject() // 如果響應狀態不是200,則返回一個拒絕的Promise},(error: AxiosError) => {return Promise.reject(error)}
)export default service // 導出封裝好的axios實例// 定義結果接口Result
export interface Result<T = unknown> {message: stringcode: numberdata: T[key: string]: any // 其他任意屬性
}export const http = {// 發送GET請求的方法,可指定數據類型T,并返回一個Promise對象,其值為Result<T>類型get<T = any>(url: string, data?: object): Promise<Result<T>> {return service.get<T, Result<T>>(url, data);},// 發送POST請求的方法,同樣可指定數據類型T,并返回一個Promise對象post<T = any>(url: string, data?: object): Promise<Result<T>> {return service.post<T, Result<T>>(url, data);},// 發送PUT請求的方法,同樣可指定數據類型T,并返回一個Promise對象put<T = any>(url: string, data?: object): Promise<Result<T>> {return service.put<T, Result<T>>(url, data);},// 發送DELETE請求的方法,同樣可指定數據類型T,并返回一個Promise對象delete<T = any>(url: string): Promise<Result<T>> {return service.delete<T, Result<T>>(url);},
};

2. 高級封裝

相比基礎封裝,高級封裝通過類的方式來創建實例,并將請求方法封裝在類的原型上。

相比之下,這種方法更加靈活,可以創建多個不同配置的axios實例,也可以在實例中添加其他自定義的方法和屬性。此外,高級封裝還將請求方法統一封裝在一個類中,結構更加清晰,易于維護和擴展。

// 先創建一個類,給類添加1個屬性 instance代表axios的實例  構造函數傳遞配置 config配置比如全局的baseURL timeout
?
import axios from "axios";
import type {AxiosInstance,AxiosError,AxiosResponse,AxiosRequestConfig,
} from "axios";
?
// interface Result<T = any> {
// ? data: T;
// ? success: boolean;
// }
?
class Request {// 限制創建的實例必須是axios的實例private instance: AxiosInstance;// 這個config是不能亂寫的,axios對創建的配置有限制的constructor(config: AxiosRequestConfig) {this.instance = axios.create(config);
?// 接下來配置axios實例身上的全局配置,比如攔截器this.instance.interceptors.request.use((config: AxiosRequestConfig) => {return config;},(error: AxiosError) => {return Promise.reject(error);});
?this.instance.interceptors.response.use((response: AxiosResponse) => {return response.data;},(error: AxiosError) => {return Promise.reject(error);});}
?// 公共方法,因為不知道返回值的類型fetchData<T>(options: AxiosRequestConfig): Promise<T> {// 將私有的instance上面發請求的操作,封裝到這個實例方法request中,這個方法的返回值應該是一個promise對象return new Promise((resolve, reject) => {this.instance.request<any, T>(options).then((res) => {resolve(res);}).catch((err) => {reject(err);});});}
?// 調用上面封裝的實例方法request,來實現get / post / delete / put 方法的快捷調用get<T>(options: AxiosRequestConfig): Promise<T> {return this.fetchData<T>({ ...options, method: "GET" });}
?post<T>(options: AxiosRequestConfig): Promise<T> {return this.fetchData({ ...options, method: "POST" });}
?put<T>(options: AxiosRequestConfig): Promise<T> {return this.fetchData({ ...options, method: "PUT" });}
?delete<T>(options: AxiosRequestConfig): Promise<T> {return this.fetchData({ ...options, method: "DELETE" });}
}
?
// 到處新new出來的實例
export const http = new Request({baseURL: "https://mock.mengxuegu.com/mock/6323def2b4c53348ed2bc5d7/example",
});

?

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

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

相關文章

TiDB v7.1.0 跨業務系統多租戶解決方案

本文介紹了 TiDB 數據庫的資源管控技術&#xff0c;并通過業務測試驗證了效果。資源管控技術旨在解決多業務共用一個集群時的資源隔離和負載問題&#xff0c;通過資源組概念&#xff0c;可以限制不同業務的計算和 I/O 資源&#xff0c;實現資源隔離和優先級調度&#xff0c;提高…

Patch SCN一鍵解決ORA-600 2662故障---惜分飛

客戶強制重啟庫之后,數據庫啟動報ORA-600 2037,ORA-745 kcbs_reset_pool/kcbzre1等錯誤 Wed Aug 09 13:25:38 2023 alter database mount exclusive Successful mount of redo thread 1, with mount id 1672229586 Database mounted in Exclusive Mode Lost write protection d…

題目:2553.分離數組中數字的數位

??題目來源&#xff1a; leetcode題目&#xff0c;網址&#xff1a;2553. 分割數組中數字的數位 - 力扣&#xff08;LeetCode&#xff09; 解題思路&#xff1a; 倒序放置數組中數位&#xff0c;然后再反轉即可。 解題代碼&#xff1a; class Solution {public int[] sepa…

區分等待、阻塞,加拓展

在java中&#xff0c;很多時候我們忽略的基本的知識&#xff0c;這是很致命的&#xff0c;只有搞懂Thread的基礎知識&#xff0c;才能進一步探索&#xff1a;reentrantLock&#xff0c;AQS等。 1&#xff1a;Thread的線程狀態到底有幾種&#xff1f; 6種&#xff1a; public…

SpringCloud微服務之間如何進行用戶信息傳遞(涉及:Gateway、OpenFeign組件)

目錄 1、想達到的效果2、用戶信息在微服務之間傳遞的兩種途徑3、用RuoYi-Cloud為例進行演示說明&#xff08;1&#xff09;網關將用戶信息寫在請求頭中&#xff08;2&#xff09;業務微服務之間通過OpenFeign進行調用&#xff0c;并且將用戶信息寫在OpenFeign準備的請求頭中&am…

香港站群服務器為什么適合seo優化?

?  香港站群為什么適合seo優化?本文主要從以下四點出發進行原因闡述。 1.香港站群服務器的優勢 2.香港站群服務器與國內服務器的對比 3.多IP站群服務器的優勢 4.香港站群服務器在SEO優化中的注意事項 1.香港站群服務器的優勢 香港站群服務器是為了滿足企業SEO優化需求而提供…

GD32F103VE使用DMA傳輸讀取內部溫度和參考電壓值

GD32F103VE使用DMA傳輸讀取內部溫度和參考電壓值。出廠CPU芯片不同&#xff0c;溫度誤差不同&#xff0c;不要糾結了。 GD32F103的ADC為12位AD轉換器,ADC轉換結果保存在16位數據寄存器中; 模擬輸入通道&#xff1a; 16個外部模擬輸入通道; 1個內部溫度傳感器通道(Vsense) 1個…

【electron】electron安裝過慢和打包報錯:Unable to load file:

文章目錄 一、安裝過慢問題:二、打包報錯&#xff1a;Unable to load file: 一、安裝過慢問題: 一直處于安裝過程 【解決】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包報錯&#xff1a;Unable to load…

camera hal|如何學習一個新平臺

全網最具價值的Android Camera開發學習系列資料~ 作者:8年Android Camera開發,從Camera app一直做到Hal和驅動~ 歡迎訂閱,相信能擴展你的知識面,提升個人能力~ 我自己目前從事的是android camera hal 的工作,工作上接觸到的芯片平臺要么是高通的,要么是mtk的。 其實…

c語言作業

作業1&#xff1a; 關于實參和形參 形參是實參的一份臨時拷貝。 形參是在函數調用的時候才實例化&#xff0c;才開辟內存空間。 函數調用如果采用傳值調用&#xff0c;改變形象不影響實參。 改變形參不是影響實參。 作業2&#xff1a; 函數調用exec&#xff08;&#xf…

C++QT教程3——手冊4.11.1自帶教程(筆記)——創建一個基于Qt Widget的應用程序

文章目錄 創建一個基于Qt Widget的應用程序創建Text Finder項目素材文件 填補缺失的部分設計用戶界面完成頭文件完成源文件創建資源文件 編譯和運行程序 參考文章 創建一個基于Qt Widget的應用程序 本教程介紹如何使用Qt Creator創建一個小型Qt應用程序&#xff0c;名為Text F…

電腦IP地址錯誤無法上網怎么辦?

電腦出現IP地址錯誤后就將無法連接網絡&#xff0c;從而無法正常訪問互聯網。那么當電腦出現IP地址錯誤時該怎么辦呢&#xff1f; 確認是否禁用本地連接 你需要先確定是否禁用了本地網絡連接&#xff0c;如果發現禁用&#xff0c;則將其啟用即可。 啟用方法&#xff1a;點擊桌…

Spring 使用注解開發、代理模式、AOP

使用注解開發 在Spring4之后&#xff0c;要使用注解開發&#xff0c;必須要保證AOP的包導入了 項目搭建&#xff1a; 在配置文件中導入約束&#xff0c;增加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

uniapp把城市換成26個字母和城市排序

后端返回的數據 我們要得效果 <template><view><view v-for"(value,key) in cities" :key"key"><view style"color: red;"> {{ key }} </view><view style"border: 1rpx solid black;"><tex…

PostgreSql 備份恢復

一、概述 數據庫備份一般可分為物理備份和邏輯備份&#xff0c;其中物理備份又可分為物理冷備和物理熱備&#xff0c;下面就各種備份方式進行詳細說明&#xff08;一般情況下&#xff0c;生產環境采取的定時物理熱備邏輯備份的方式&#xff0c;均是以下述方式為基礎進一步研發編…

Linux 基礎

鞏固基礎&#xff0c;砥礪前行 。 只有不斷重復&#xff0c;才能做到超越自己。 能堅持把簡單的事情做到極致&#xff0c;也是不容易的。 linux的目錄結構 linux的文件系統采用樹狀的目錄結構&#xff0c;在此結構的最上層是根目錄“/”&#xff0c; 然后在此目錄下再創建其他…

【算法——雙指針】LeetCode 1089 復寫零

千萬不要被這道題標注著“簡單”迷惑了&#xff0c;實際上需要注意的細節很多。 題目描述&#xff1a; 解題思路&#xff1a; 正序遍歷&#xff0c;確定結果數組的最后一個元素所在的位置&#xff1b;知道最后一個元素的位置后倒序進行填充。 先找到最后一個需要復寫的數 先…

javaee dom4j讀取xml文件

引入jar包 dom4j-1.6.1.jar 創建xml文件 <?xml version"1.0" encoding"UTF-8"?> <books><book id"1"><title ID"t1">背影</title><price>88</price><author>三毛</author>…

Excel表格制作,快速提升效率好方法!

“作為一個剛開始工作的職場新人&#xff0c;每天要做各種不同的表格&#xff0c;真的讓我很崩潰&#xff0c;感覺我對這些表格制作一點都不了解&#xff0c;Excel表格制作有什么比較好的方法嗎&#xff1f;” Excel作為一款廣泛應用于各個領域的管理和分析工作&#xff0c;給我…

【STM32】FreeRTOS消息隊列和信號量學習

一、消息隊列&#xff08;queue&#xff09; 隊列是一種用于實現任務與任務之間&#xff0c;任務與中斷之間消息交流的機制。 注意&#xff1a;1.數據的操作是FIFO模式。 2.隊列需要明確數據的大小和隊列的長度。 3.寫和讀都會出現堵塞。 實驗&#xff1a;創建一個消息隊列…