项目背景是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 组询问。对…