vue3.0 + TypeScript 中使用 axios 同時進行二次封裝

項目背景是vite搭建的vue3.0 + TypeScript 的項目,需要統一處理和統一維護就對axios進行了二次封裝

axios的安裝

npm install axios

定義http文件夾然后內部定義index.ts文件,內部開始封裝

import axios, {type AxiosInstance} from "axios"; // AxiosInstance (axios的配置好的類型定義)
import qs from 'qs'; // 引入qs處理字符串的解析和序列化
// 定義 promise 類型
interface Result<T> {code:number;message:string;data: T;total?: number;
}
export default class request {axiosFun: AxiosInstance;  // 聲明初始化的屬性constructor() {// 設置連接地址和超時時間還有憑證this.axiosFun = axios.create({timeout: 1000 * 60 * 5,baseURL: "http://localhost:8888/",withCredentials: true,});// 統一增加請求頭 也可以根據路徑判斷來添加請求頭this.axiosFun.interceptors.request.use((config:any)=>{config.headers.token = localStorage.token || '';  return config;});// 請求返回后的統一處理 在這里可以處理返回的不同狀態碼this.axiosFun.interceptors.response.use((res:any)=>{if (res.headers["content-disposition"]) {return res;}},(err:any)=>{return Promise.resolve(err)});}//get請求public static getFetch(url: string, data?: any): Promise<Result<object>> {return new Promise((resolve, reject) => {new request().axiosFun.get(url, { params: data }).then((result:any) => {resolve(result)}).catch((error:any) => {reject(error)})})}//post json請求public static postJson<T>(url: string, data?: any): Promise<Result<object>> {return new Promise((resolve, reject) => {new request().axiosFun.post(url, JSON.stringify(data), { headers: {'Content-Type': 'application/json;charset=UTF-8'} }).then((result:any) => {resolve(result)}).catch((error:any) => {reject(error)})})}//post formData請求public static postFormData(url: string, data?: any): Promise<Result<object>> {return new Promise((resolve, reject) => {new request().axiosFun.post(url, data,{ headers: {'Content-Type': 'multipart/form-data'} }).then((result:any) => {resolve(result)}).catch((error:any) => {reject(error)})})}//post 表單請求public static postFormUrlencoded(url: string, data?: any): Promise<Result<object>> {return new Promise((resolve, reject) => {new request().axiosFun.post(url, qs.stringify(data, {indices: false})).then((result:any) => {resolve(result)}).catch((error:any) => {reject(error)})})}//post json請求 返回blobpublic static postFileJson<T>(url: T, data?: any): Promise<Result<object>> {return new Promise((resolve, reject) => {new request().axiosFun.post(url as string, JSON.stringify(data), { headers: {'Content-Type': 'application/json;charset=UTF-8'},responseType:'blob' }).then((result:any) => {fileData(result);}).catch((error:any) => {reject(error)})})}//get 下載文件 返回blobpublic static getFileFetch(url: string, data?: any): Promise<Result<object>> {return new Promise((resolve, reject) => {new request().axiosFun.get(url, { params: data,responseType: "blob" }).then((result:any) => {fileData(result);}).catch((error:any) => {reject(error)})})}
}
// 封裝 a 標簽下載文件
const fileData = (result:any)=>{let fileName:string = result.headers['content-disposition'].split('fileName=')[1]fileName = decodeURIComponent(fileName)let blob:Blob = new Blob([result.data])const fileUrl:string = URL.createObjectURL(blob)const download:any = document.createElement('a')download.download = fileNamedownload.style.display = 'none'download.href = fileUrldocument.body.appendChild(download)download.click()document.body.removeChild(download)URL.revokeObjectURL(fileUrl)return
}

http文件夾定義modules文件夾再定義homeApi.ts文件

import request from "@/http/request";  // 引入封裝好的文件
export default class homeRequest {static messageList(params?: Object) {return request.postJson('/messageList', params)}
}

http文件夾內部定義api.ts文件

import HomeRequest from "@/http/modules/homeApi";
interface IHomeRequest {messageList(params?: Object): Promise<any>;
}
interface IApi {home: IHomeRequest;
}
export default class Api implements IApi {static home:IHomeRequest = HomeRequest
}

頁面調用

import api from "@/http/api";
interface allInfo {[key:string]:any
}
interface Result<T> {code:number;message:string;data: T;total?: number;
}
const {code,data} = api.home.messageList(params) as Result<allInfo>
if(code === 200) {console.log(data)
}

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

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

相關文章

ESP32- 項目應用1 音樂播放器之sd的驅動配置 #1

音樂播放器 ESP32- 項目應用1 音樂播放器之sd的驅動配置 #1 文章目錄 音樂播放器 1 sd卡介紹 1.1 SDCARD介紹 1.2 物理結構 1.3 協議說明 1.4 sd 卡模式 1.5 數據模式 1.6 sdio 初始化流程 1.7 SPI 模式下的 SD 卡初始化 2 原理圖 2.1 sd原理圖 2.2 esp32的接口 3 代碼配置 3.…

Vue.js 指令系統完全指南:深入理解 v- 指令

Vue.js 的指令系統是其最強大的特性之一&#xff0c;通過以 v- 開頭的特殊屬性&#xff0c;我們可以在模板中聲明式地綁定底層Vue實例的數據。本文將深入講解Vue中最重要的指令&#xff0c;幫助掌握Vue的核心功能。 文章目錄1. v-model&#xff1a;雙向數據綁定的核心基本用法修…

計算機分類匯總大全

前端部分有 Node.js、ActionScript、Swift、TypeScript、Webpack、JavaScript。需要分別詳細說明它們的定義、特點、應用場景、優缺點等。比如 Node.js&#xff0c;要提到它的運行環境、事件驅動、非阻塞 I/O&#xff0c;適合的應用如 API 服務、實時應用&#xff0c;以及常用框…

模擬鏈路濾波器設計一些細節

目錄 原設計思路剖析 300M帶寬仿真與計算 原設計思路剖析 濾波器設計的一些細節,以下為ADS54J60模擬鏈路的一些問題設計原理圖 實際電路設計如上所示,但是實際bom并未按此設計,根據實際的BOM明細以及ADC使用說明書,可以間接理解原設計者的設計初衷,是將ADC的一部分特性…

CatBoost 完整解析:類別特征友好的梯度提升框架

1?? 什么是 CatBoost&#xff1f;CatBoost&#xff08;Categorial Boosting&#xff09;是由 Yandex&#xff08;俄羅斯搜索引擎公司&#xff09;開源的梯度提升框架&#xff0c;專為類別特征處理優化。核心特點&#xff1a;無需手動 one-hot / LabelEncoding&#xff0c;原生…

NDBmysql-cluster集群部署腳本

NDB(Network Database)是MySQL Cluster的核心存儲引擎,專為高可用性、高吞吐量、分布式數據存儲設計,采用內存計算+磁盤持久化架構,支持跨節點數據分片與自動冗余,適用于對實時性和可靠性要求嚴苛的業務場景(如金融交易、電信計費、實時分析等)。 今天大白鼠就分享構建…

計算機網絡中的socket是什么?編程語言中的socket編程又是什么?python的socket編程又該如何用?

1. 計算機網絡中的 Socket 是什么&#xff1f; 想象一下電話系統&#xff1a; 電話插座 (Socket)&#xff1a; 是墻上的一個物理接口&#xff0c;它本身不是通話&#xff0c;但它是建立通話連接的端點。你需要把電話線插進插座才能打電話。通話 (Connection)&#xff1a; 是兩臺…

【科普】進程與線程的區別

一、定義與概念&#xff1a;進程&#xff1a;進程是執行中的一段程序。一旦程序被載入到內存中并準備執行&#xff0c;就變成了一個進程。進程是表示資源分配的基本概念&#xff0c;又是調度運行的基本單位&#xff0c;是系統中的并發執行的單位。線程&#xff1a;線程是進程中…

Conda創建虛擬環境,解決不同項目的沖突!

隨著需求的增多&#xff0c;又要增加多幾個不同的項目來在本地測試&#xff0c;這個時候往往就會遇到 不同項目的Python版本不同等等一系列問題&#xff0c;只好請出Conda來幫忙。 一、先去下載安裝一下Conda Conda | Anaconda.org 安裝完后&#xff0c;需要給CONDA做個環境變…

RK3568下的進程間廣播通信:用C語言構建簡單的中心服務器

最近的項目中需要實現這樣一個功能,就是一個進程A發消息,進程B和進程C都能收到相同的消息,同樣,進程B發消息,進程A和進程C也都能收到消息,就像下圖中的描述。 使用一個中心服務器作為消息轉發樞紐,所有客戶端連接到服務器,發送消息到服務器后,服務器再將消息轉發給所有…

激光雷達/相機一體機 時間同步和空間標定(1)

一、參考鏈接 海康威視、LIVOX與PTP時間同步_海康相機ptp同步-CSDN博客 基于PTP實現主機與相機系統時鐘同步功能_ptp同步-CSDN博客

嵌入式系統的中斷控制器(NVIC)

1. NVIC的核心功能 核心價值&#xff1a;NVIC通過硬件級中斷管理、自動狀態處理及低延遲優化&#xff0c;為實時系統提供確定性響應&#xff0c;是Cortex-M芯片實時性的基石。 中斷優先級管理 支持多級可編程優先級&#xff08;通常4-8位&#xff0c;如STM32用4位實現16級優先級…

【源力覺醒 創作者計劃】2025年國產AI模型深度測評:文心大模型4.5、DeepSeek、Qwen3能力大比拼

文章目錄引言&#xff1a;AI大模型的新時代一、模型架構與技術生態對比1. 文心大模型4.5系列2. DeepSeek3. 通義千問&#xff08;Qwen 3.0&#xff09;二、語言理解能力實測2.1 情感分析測試2.1.1 文心一言的表現2.1.2 DeepSeek的表現2.1.3 Qwen 3.0的表現2.1.4 測試結果分析2.…

從C++0基礎到C++入門(第十五節:switch語句)

一. switch語句1.1 語法結構如下&#xff1a;switch (表達式) {case 常量1:// 代碼塊1break;case 常量2:// 代碼塊2break;default:// 默認代碼塊 }1.2 注意 &#xff1a;表達式必須是整型或枚舉類型&#xff08;如int、char&#xff09;。case后的常量必須與表達式類型兼容。學…

編程與數學 03-002 計算機網絡 16_網絡編程基礎

編程與數學 03-002 計算機網絡 16_網絡編程基礎一、網絡編程的基本概念&#xff08;一&#xff09;客戶端與服務器模型&#xff08;二&#xff09;套接字&#xff08;Socket&#xff09;編程的基本原理二、基于TCP的網絡編程&#xff08;一&#xff09;TCP套接字的創建與使用&a…

在純servlet項目中,使用@WebFilter定義了多個filter,如何設置filter的優先級

在純 Servlet 項目中&#xff0c;WebFilter 注解本身并不提供直接的屬性來設置過濾器的優先級&#xff08;如過濾器執行的順序&#xff09;。但是&#xff0c;你可以通過以下幾種方式來控制過濾器的執行順序&#xff1a;1. 通過 web.xml 配置過濾器的順序在 web.xml 中&#xf…

關于鴉片戰爭的歷史

19世紀&#xff0c;英國東印度公司獲得了鴉片貿易的壟斷權&#xff0c;而猶太人是東印度公司的主要投資人之一&#xff0c;英國東印度公司又將鴉片經營權外包給了猶太人。其中&#xff0c;塞法迪猶太人控制了主要的鴉片交易&#xff0c;著名的沙遜家族就是當時臭名昭著的猶太鴉…

Maven - 并行安全無重復打包構建原理揭秘

作者&#xff1a;唐叔在學習 專欄&#xff1a;唐叔的Java實踐 標簽&#xff1a; #Maven并行構建 #Maven多線程打包 #Java構建優化 #Maven性能調優 #CI/CD加速 #Maven反應堆原理 #避免重復編譯 #高并發構建 文章目錄一、遇到問題&#xff1a;并行打包會不會翻車&#xff1f;二、…

phpyun人才系統v7.1使用升級補丁怎么從授權版升級至vip版?我說下我的技巧有資源的可以看過來,這樣就不用花錢麻煩官方了,新版本照樣支持小程序源碼

前:這個方法我只在Phpyun 的7.x系列使用過&#xff0c;低于這個版本的我暫時沒有研究過&#xff0c;我感覺大同小異&#xff01; 一. 升級前提條件 無論現在你使用的是商業版還是學習版 想垮系列升級你必須有對應的升級補丁&#xff0c;比如說你是授權版或旗艦版 想升級到最新的…

P13014 [GESP202506 五級] 最大公因數

題目描述對于兩個正整數 a,b&#xff0c;他們的最大公因數記為 gcd(a,b)。對于 k>3 個正整數 c1?,c2?,…,ck?&#xff0c;他們的最大公因數為&#xff1a;gcd(c1?,c2?,…,ck?)gcd(gcd(c1?,c2?,…,ck?1?),ck?)給定 n 個正整數 a1?,a2?,…,an? 以及 q 組詢問。對…