之前我写了一篇文章,分享了自己的项目中对于接口管理的方法。总结下来就是:定义接口文件--withAxios导出--调用接口方法。这样实现了接口的统一管理和调用接口的语义化与简单化。

根据在项目的使用,发现有以下问题需要优化:

  1. withAxios导出的接口方法对象对编辑器来说是不透明的,所以代码提示功能缺失。
  2. 同一个方法调用多次,如何保证组件总是获取到最后一次的返回信息。

根据以上问题,采用了以下解决方案:

  1. 使用typescript的泛型解决。
  2. 调用同一个方法时,取消掉上次未完成的请求,这里使用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(...)

说明:

  1. 使用泛型虽然有了代码提示,但是额外增加了编码量,因为要手动维护一个方法接口,有利有弊吧,通过ts我还没有找到更好的方法。同事之前有过一个解决办法:接口管理使用对象的形式,然后withAxios修改这个对象各属性的getter,将getter指向通过axios包装后的方法,最终实现了本文相同的调用方式和代码提示,但这种方法有点hack的感觉。
  2. 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统一接口管理及优化的更多相关文章

  1. Vue+axios统一接口管理

    通过axios请求接口已经很简单了,但最近在做一个vue项目,想着把axios请求再封装一下,这样api就可以只在一处配置成方法,在使用的时候直接调用这个方法. 但咱们不用每个接口都定义成一个啰嗦的a ...

  2. vue项目接口管理,所有接口都在apis文件夹中统一管理

    参考:https://www.codercto.com/a/53432.html 在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢? 方法可能不只一种,本文 ...

  3. 【vue】---项目接口管理---【巷子】

    一.前言 在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口 假设后端的文档分成了以下几个模块 1.发现模块 2.个人信息模块 3.商品模块 4.评论模块 ...... ...

  4. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 几十套业务系统集中统一授权管理实现经验分享

    由于这几年互联网电商的快速发展,快递公司也进入了快速发展的绝好快速成长期.随着社会的强劲需求公司的业绩年年攀新高.快速发展的公司都需要有强大的IT信息系统,硬件设备基本上款到了货也可以到了,但是软件系 ...

  5. Flask框架学习笔记(API接口管理平台 V2.0)

    博主今天把API接口管理平台发布到github了,这次是更新一些功能 如支持本地数据库sqlite3.优化了数据结构 技术方面跟之前V1.0相同,只增加生产本地数据:但是为了支持层级的参数,修改了数据 ...

  6. 开源免费接口管理平台eoLinker AMS开源版 V3.2.0更新,增加批量导出导入接口功能!

    eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本,提高项 ...

  7. 分享一个开源免费、目前最好的API接口管理平台----eoLinker

    一.概况 eoLinker 是目前业内领先.国内最大的在线 API 接口管理平台,提供自动生成 API 文档.API 自动化测试.Mock 测试.团队协作等功能,旨在解决由于前后端分离导致的开发效率低 ...

  8. 【开源】接口管理平台eoLinker AMS 开源版3.1.5同步线上版!免费增加大量功能!

    概要:eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本, ...

  9. 【工具】-RAP接口管理工具

    前言 RAP 是一个可视化接口管理工具, 通过分析接口结构,动态生成模拟数据,校验真实接口正确性, 围绕接口定义,通过一系列自动化工具提升我们的协作效率. 在 RAP 中,您可定义接口的 URL.请求 ...

随机推荐

  1. MySql数据库之单表数据查询

    查询数据 1.查询所有数据: select * from 表名; 2.根据指定条件查询数据:

  2. ios 测试网络是否连接

    转自:http://blog.csdn.net/lwq421336220/article/details/16982857 - (BOOL) connectedToNetwork { //创建零地址, ...

  3. mac端口占用

    lsof -i tcp:port 可以查看该端口被什么程序占用,并显示PID port 替换成端口号, eg: lsof -i tcp:8081 kill pid 杀死PID

  4. Springboot结合Redis

    安装 Redis   安装 gcc Yum install gcc-c++ 解压 redis.3.0.0.tar.gz 压缩包 tar -zxvf redis-3.0.0.tar.gz 进入解压后的目 ...

  5. [TimLinux] asciinema Linux终端录制工具嵌入私有web中

    yum install asciinema https://github.com/asciinema/asciinema-player # 下载asciinema-player.css, asciin ...

  6. BZOJ 2049洞穴探测

    辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假如两个洞穴可 ...

  7. nginx的一些知识(一)

    第8章 web网站的搭建 curl -Lv 网站地址:查看网站的请求信息和响应信息,并且会将结果输出出来 8.1 web网站的的传输原理过程 会进行DNS的解析 进行客户端和服务端进行三次握手协议 客 ...

  8. 适用于Java开发人员的SOLID设计原则简介

    看看这篇针对Java开发人员的SOLID设计原则简介.抽丝剥茧,细说架构那些事——[优锐课] 当你刚接触软件工程时,这些原理和设计模式不容易理解或习惯.我们都遇到了问题,很难理解SOLID + DP的 ...

  9. 2019年Spring Boot面试都问了什么?快看看这22道面试题!

    Spring Boot 面试题 1.什么是 Spring Boot? 2.Spring Boot 有哪些优点? 3.什么是 JavaConfig? 4.如何重新加载 Spring Boot 上的更改, ...

  10. node-sass下载失败

    在angular项目中下载依赖npm install时提示node-sass安装失败,解决方法如下: 1.下载win32-x64-57_binding.node文件至指定目录 2.添加环境变量: 变量 ...