ts封装axios并处理返回值的实战案例
短信预约 -IT技能 免费直播动态提醒
本项目的案例是针对vue3
准备vue3+ts+axios的项目环境,这里不演示
class="lazy" data-src下新建所需文件夹及对应文件,如下图
- api 保存所有的接口列表及对应的返回数据类型
- http 初始化axios,如果超时,设置拦截器等操作
- axios 二次封装好的axios,供开发人员使用
设置api.ts,假设如下
const apiList = {
'getData': '/getData',
'othersData': '/othersData'
}
export type apiKeyType = keyof typeof apiList;
export interface apiKeyDataType {
'getData': {
code: number;
data: {
name: string;
age: number;
work: string[]
}
},
'othersData': {
code: number;
data: string[]
}
}
export default apiList;
设置http.ts
import axios, {Method, AxiosInstance, AxiosRequestConfig, AxiosPromise, AxiosInterceptorManager, AxiosResponse} from 'axios';
import qs from 'qs';
import {apiKeyType, apiKeyDataType} from './api';
type ResultDataType = apiKeyDataType[apiKeyType];
interface NewAxiosInstance extends AxiosInstance {
<T = any>(config: AxiosRequestConfig): AxiosPromise<T>;
interceptors: {
request: AxiosInterceptorManager<AxiosRequestConfig>;
response: AxiosInterceptorManager<AxiosResponse<ResultDataType>>;
}
}
//基本的初始化设置
let http: NewAxiosInstance = axios.create({
baseURL: import.meta.env.VITE_BASE_URL as string, //因为使用的是vite构建的项目,所以这里是这么获取代理名称的,根据自己情况修改
timeout: 3 * 1000// 超时时间
});
// 请求拦截器
const QS_METHOD: Method[] = ['POST', 'post', 'PUT', 'put'];
const GET_METHOD: Method[] = ['GET', 'get', 'DELETE', 'delete'];
http.interceptors.request.use(response => {
if(response.method && QS_METHOD.includes(response.method)){// 这里只处理post请求,根据自己情况修改
response.data = qs.stringify(response.data);
}else if(response.method && GET_METHOD.includes(response.method)){//设置GET的请求参数
response.params = qs.parse(response.data);
response.data = undefined;
}
return response;
}, error => {
return error;
});
//响应拦截器
http.interceptors.response.use(response => {
return Promise.resolve(response);
}, error => {
return error;
});
export default http;
设置axios.ts
import axios from '@/server/http';
import apiList, {apiKeyType, apiKeyDataType} from './api';
import {AxiosRequestConfig} from 'axios';
export default <T extends apiKeyType>(obj: AxiosRequestConfig & {url: T}) => {
return new Promise<apiKeyDataType[T]>((resolve, reject) => {
axios<apiKeyDataType[T]>({
url: apiList[obj.url],
data: obj.data || {},
method: obj.method || 'GET',
responseType: obj.responseType || 'json'
}).then(res => {
resolve(res.data);
}).catch(error => {
reject(error);
})
})
}
最终效果
在对应文件中引入server下的axios文件输入选择url时,将会有全部接口列表提示,如下图
选到getData时,可以看到返回值是对应的数据类型,如下
选到othersData时,可以看到返回如下
结束
到此这篇关于ts封装axios并处理返回值的文章就介绍到这了,更多相关ts封装axios处理返回值内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341