项目背景是vite搭建的vue3.0 + TypeScript 的项目,需要统一处理和统一维护就对axios进行了二次封装
axios的安装
npm install axios
定义http文件夹然后内部定义index.ts文件,内部开始封装
import axios, {type AxiosInstance} from "axios";
import qs from 'qs';
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)
});
}
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)
})
})
}
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)
})
})
}
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)
})
})
}
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)
})
})
}
public 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)
})
})
}
public 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)
})
})
}
}
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 = fileName
download.style.display = 'none'
download.href = fileUrl
document.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)
}