axios统一接口管理及优化
之前我写了一篇文章,分享了自己的项目中对于接口管理的方法。总结下来就是:定义接口文件--withAxios导出--调用接口方法。这样实现了接口的统一管理和调用接口的语义化与简单化。
根据在项目的使用,发现有以下问题需要优化:
- withAxios导出的接口方法对象对编辑器来说是不透明的,所以代码提示功能缺失。
- 同一个方法调用多次,如何保证组件总是获取到最后一次的返回信息。
根据以上问题,采用了以下解决方案:
- 使用typescript的泛型解决。
- 调用同一个方法时,取消掉上次未完成的请求,这里使用axios的cancel方法。实现思路是在返回的方法对象中增加一个`${name}Cancel`的方法,保存取消上一次方法的回调,下次请求时固定调用这个取消方法以保证本次请求是当前唯一一个请求。(这里只提供axios层面的解决办法,不讨论其他办法,比如采用redux-saga的话可以使用takeLatest解决)
通过代码展示一下(React项目):
service.ts
import { IApiItem } from '@/configs/api/declares';
import withAxios from '@/utils/withAxios';
const api: IApiItem[] = [
{ name: 'getSummary', url: 'http://xx:8000/api/getSummary' },
{ name: 'getDetail', url: 'http://xx:8000/api/getDetail' },
{ name: 'getDetailChildren', url: 'http://xx:8000/api/getDetailChildren' },
{ name: 'getCurrentUser', url: 'http://xx:8000/api/getCurrentUser' },
];
interface IProdMonitorApi {
getSummary: any;
getDetail: any;
getDetailChildren: any;
getCurrentUser: any;
}
export default withAxios<IProdMonitorApi>(api);
withAxios.ts
function withAxios<T>(apiConfig: IApiItem[], usePassportOrigin: boolean = false): T {
const serviceMap = {} as T;
apiConfig.map(({ name, url, method = 'get', ...rest }: IApiItem) => {
return (serviceMap[name] = async function(data = {}) {
if (serviceMap[`${name}Cancel`] && typeof serviceMap[`${name}Cancel`] === 'function') {
serviceMap[`${name}Cancel`]();
}
const source = axios.CancelToken.source();
serviceMap[`${name}Cancel`] = () => {
source.cancel(`已取消上次未完成请求:${name}`);
};
rest.cancelToken = source.token;
let key = 'params';
const apiMethod = method.toLowerCase();
if (apiMethod === 'post' || apiMethod === 'put') {
key = 'data';
}
let fetchUrl = url;
if (url.indexOf('http') !== 0) {
fetchUrl = usePassportOrigin
? NetworkUtils.passportOrigin + url
: NetworkUtils.serverOrigin + url;
}
return axios({
method,
url: fetchUrl,
[key]: data,
fetchName: name,
...rest,
} as AxiosRequestConfig);
});
});
return serviceMap;
}
export default withAxios;
在需要使用接口的地方:
import Service from "./service.ts" Service.getSummary(requestParams).then(...)
说明:
- 使用泛型虽然有了代码提示,但是额外增加了编码量,因为要手动维护一个方法接口,有利有弊吧,通过ts我还没有找到更好的方法。同事之前有过一个解决办法:接口管理使用对象的形式,然后withAxios修改这个对象各属性的getter,将getter指向通过axios包装后的方法,最终实现了本文相同的调用方式和代码提示,但这种方法有点hack的感觉。
- cancel掉上一个接口这种方式保证了数据总是来源于最后一个请求接口,但有时可能会出现问题,比如:在同一个页面需要展示两种用户:common用户和admin用户,后端给的接口是/api/v1/user,当参数type=1时为common,type=2时为admin,如果我们把这个接口定义为一个方法getUser,在这个页面会同时发出两个请求:Service.getUser({type:1}),Service.getUser({type:2}),但是,由于withAxios会取消上一个相同方法的请求,那么很可能有一个请求被取消,解决办法是在service中定义为两种方法:getCommonUser和getAdminUser,将type直接写入url中。这样也符合我们语义化的目标。
axios统一接口管理及优化的更多相关文章
- Vue+axios统一接口管理
通过axios请求接口已经很简单了,但最近在做一个vue项目,想着把axios请求再封装一下,这样api就可以只在一处配置成方法,在使用的时候直接调用这个方法. 但咱们不用每个接口都定义成一个啰嗦的a ...
- vue项目接口管理,所有接口都在apis文件夹中统一管理
参考:https://www.codercto.com/a/53432.html 在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢? 方法可能不只一种,本文 ...
- 【vue】---项目接口管理---【巷子】
一.前言 在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口 假设后端的文档分成了以下几个模块 1.发现模块 2.个人信息模块 3.商品模块 4.评论模块 ...... ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 几十套业务系统集中统一授权管理实现经验分享
由于这几年互联网电商的快速发展,快递公司也进入了快速发展的绝好快速成长期.随着社会的强劲需求公司的业绩年年攀新高.快速发展的公司都需要有强大的IT信息系统,硬件设备基本上款到了货也可以到了,但是软件系 ...
- Flask框架学习笔记(API接口管理平台 V2.0)
博主今天把API接口管理平台发布到github了,这次是更新一些功能 如支持本地数据库sqlite3.优化了数据结构 技术方面跟之前V1.0相同,只增加生产本地数据:但是为了支持层级的参数,修改了数据 ...
- 开源免费接口管理平台eoLinker AMS开源版 V3.2.0更新,增加批量导出导入接口功能!
eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本,提高项 ...
- 分享一个开源免费、目前最好的API接口管理平台----eoLinker
一.概况 eoLinker 是目前业内领先.国内最大的在线 API 接口管理平台,提供自动生成 API 文档.API 自动化测试.Mock 测试.团队协作等功能,旨在解决由于前后端分离导致的开发效率低 ...
- 【开源】接口管理平台eoLinker AMS 开源版3.1.5同步线上版!免费增加大量功能!
概要:eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本, ...
- 【工具】-RAP接口管理工具
前言 RAP 是一个可视化接口管理工具, 通过分析接口结构,动态生成模拟数据,校验真实接口正确性, 围绕接口定义,通过一系列自动化工具提升我们的协作效率. 在 RAP 中,您可定义接口的 URL.请求 ...
随机推荐
- DateTime格式转换部分介绍
DateTime与字符串转换: DateTime()与转换为字符串主要依靠DateTime().ToString(string format) 函数,以我的理解,参数format大体分为单个字母和多个 ...
- ubuntu部署.Net Core3.1(Nginx+pm2)
前言 虽然.NetCore已经出来很久了,但是很多初学者还是不会在linux部署.所以写一篇初学者在ubuntu下部署Core的全过程,大佬请无视. 环境搭建 ubuntu18.04 NetCore3 ...
- 上手spring boot项目(一)之如何在controller类中返回到页面
题记:在学习了springboot和thymeleaf之后,想完成一个项目练练手,于是使用springboot+mybatis和thymeleaf完成一个博客系统,在完成的过程中出现的一些问题,将这些 ...
- Selenium 4 Python的最佳测试框架
随着Python语言的使用越来越流行,基于Python的测试自动化框架也越来越流行.在项目选择最佳框架时,开发人员和测试人员会有些无法下手.做出选择是应该判断很多事情,框架的脚本质量,测试用例的简单性 ...
- CF600E Lomsat gelral (启发式合并)
You are given a rooted tree with root in vertex 1. Each vertex is coloured in some colour. Let's cal ...
- promise 进阶 —— async / await 结合 bluebird
一.背景 1.Node.js 异步控制 在之前写的 callback vs async.js vs promise vs async / await 里,我介绍了 ES6 的 promise 和 ES ...
- 【CSS】346- 你所不知道的 CSS 阴影技巧与细节
偷懒了1个多礼拜,在工作饱和的情况下,怎么坚持学习?今天的分享来自@Coco国服第一切图仔,我们聊聊CSS属性box-shadow- 关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 ...
- 基于Storm的WordCount
Storm WordCount 工作过程 Storm 版本: 1.Spout 从外部数据源中读取数据,随机发送一个元组对象出去: 2.SplitBolt 接收 Spout 中输出的元组对象,将元组中的 ...
- 《Java基础知识》Java注解"@"详解
Java注解含义: Java注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的.Java注解又叫java标注,java提供了一套机制,使得 ...
- [转]JVM参数使用手册
内存分配相关 Xms 英文释义:Initial heap size(in bytes) 中文释义:堆区初始值 使用方法:-Xms2g 或 -XX:InitialHeapSize=2048m Xmx 英 ...