背景
项目开发过程中,有一个必不可少的环节--接口联调,由于前端后端开发进度不同,有时前端需要等待后端的接口,或者前端为了调试ui,需要在本地mock接口数据。不同的接口,返回的数据格式是不一样的,每次都去手动mock数据,难免繁琐和低效。能否搭建一个自动化的mock平台,自动从接口文档中获取所有接口的数据格式,然后mock对应的数据返给前端呢?
实现
基本原理是:前端发出的接口请求被代理到Mock平台,Mock平台根据接口url去调接口文档api拿到接口数据格式,根据接口数据格式生成一份模拟数据返给前端;
原理是非常简单的,而且我们对前端代码是无侵入式的,非常友好。但实现过程中也遇到几个比较难处理的问题,下面详细讲解一下Mock平台的实现细节。
公司的接口是分模块的,每个模块内部是接口详情。这里我抓取了公司接口文档的3个api.
/api/module/list 这个api返回所有的接口模块,会返回类似[{name: '模块名', _id: 32468437}]这样的数组
/api/list?moduleId=xx 这个api根据模块id(也就是上一个接口返回的那个模块_id),返回该模块的所有接口。这里就有一个问题了?前端是用url来请求接口的,如何根据url拿到接口详情数据呢?难道前端请求时去遍历所有的url吗?肯定是不合适的,我的做法是首先遍历一遍所有的模块的接口详情,把url和id的对应关系保存一个对象序列化到一个文件中,然后node程序运行时,再把url和id映射对象读到内存中缓存,当匹配不到请求的url时,我们重新遍历一次接口文档中接口,刷新缓存(限制每小时只能刷新一次,防止不必要的请求)。
/api/get?id=xx 这个api根据接口id返回接口详情数据,我们根据缓存拿到前端请求的url的id后,调用这个接口拿到接口的数据格式
node层用koa来响应请求和返回mock数据,根据接口详情api拿到接口数据格式,然后用Mock生成模拟数据。如何使mock的数据和真实数据更像?这也是一个比较难处理的问题,目前的做法是对特定字段的数据做特殊化处理,比如字段名为mobile,其数据类型是String,但我们知道它代表一个手机号,就返回一个手机号,某些特定字段可以这样做特殊处理。其他的字段,就根据接口类型返回符合类型的随机数据。
流程如下图:
待改进
目前对特定字段的处理是在代码里用逻辑判断,可以考虑生成一份配置文件来保存。毕竟特定业务中的特定字段也不会特别多,用配置文件来保存是可行的,也比较容易维护。
目前没有请请求参数做检查, 其实也可以校验请求参数的类型是否正确。
请求透传,如果某些接口在线上已经可以调通,我们直接调线上接口返回真实数据,对于线上接口调不通的再返回模拟数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。