当前位置: 首页 > news >正文

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.dtcms.com/a/307528.html

相关文章:

  • ESXI虚拟交换机 + H3C S5120交换机 + GR5200路由器组网笔记
  • 数据结构与算法:队列的表示和操作的实现
  • Linux 下自动化脚本安装Jdk、Nginx等软件
  • Java语言/Netty框架的新能源汽车充电桩系统平台
  • 《人工智能导论》(python版)第2章 python基础2.2编程基础
  • Rust视频处理开源项目精选
  • FFmpegHandler 功能解析,C语言程序化设计与C++面向对象设计的核心差异
  • 【日常问题解决方案】VS2022不小心解决方案资源管理器把关掉了怎么办
  • spring cloud alibaba ——gateway网关
  • Day36| 1049. 最后一块石头的重量 II、494.目标和、474.一和零
  • 图论-最短路Dijkstra算法
  • 澳交所技术重构窗口开启,中资科技企业如何破局?——从ASX清算系统转型看跨境金融基础设施的赋能路径
  • Python爬虫07_Requests爬取图片
  • 基于Spring Boot实现中医医学处方管理实践
  • 【05】大恒相机SDK C#开发 —— Winform中采集图像并显示
  • 金融分类提示词演示
  • 【03】大恒相机SDK C#开发 —— 回调采集图像,关闭相机
  • STM32学习记录--Day4
  • TOC-Transformer-LSTM-ABKDE,计算机一区算法龙卷风优化算法应用到概率区间预测!Matlab实现
  • 九识智能与星逻智能达成战略合作,共推“无人车 + 无人机”空地一体巡检升级
  • Java中的“Dead Code”
  • 基于 Amazon Nova Sonic 和 MCP 构建语音交互 Agent
  • set_max_delay为何失效了?
  • Python爬虫06_Requests政府采购严重违法失信行为信息记录爬取
  • 全栈:怎么把IDEA和Maven集成一下?
  • 【盘古100Pro+开发板实验例程】FPGA学习 | 基于紫光 FPGA 的键控 LED 流水灯
  • 水库泄洪声光电监测预警系统解决方案
  • Kubernetes (K8s) 部署资源的完整配置OceanBase
  • sqli-labs:Less-13关卡详细解析
  • C 语言结构体深度解析:从数据聚合到内存管理的全维度指南