在开发手机端App时,通常会出现移动端新页面开发的差不多了,后台接口还没Ready,导致前后端联调浪费了大量时间。
联调过程中又往往涉及到测试服务的切换、抓包验证以及测试异常数据等测试。进而涉及到App重新打包,配置Charles等抓包工具,后台改数据等等工作,非常麻烦。
今天就使用Node.js实现一个用来调试的server,简化这些调试工作。
这个server涉及到以下几个功能:
1. 接口数据的Mock。访问接口即返回我们定义好的假数据,便于在服务端开发完成前就可以测试接口效果。也便于异常值的验证。
2. 接口转发。在联调阶段不需要Mock数据时,可将请求转发给真正的后台接口。这样无需App更改url打包。
3. 抓包打印。将App发给调试Server的请求以及服务端返回的数据输出在Web页面上。这可以满足最基本的抓包需求。
这样我们就可以把调试当中大部分配置工作都放在这个Server上。在Server上做了更改,重启就可生效,省时省力。
服务搭建
安装Node与Express框架
首先安装好Node.js,这个比较简单,用官网的安装包就搞定了。
接下来配置Express,使用npm命令
npm install express-generator -g
安装好以后使用Express的命令行工具生成Server框架。
给server起个名字,比如 avalon
运行命令
express -e avalon
暂时还用不到页面模板的功能,这里就使用 -e 参数用ejs作为页面模板。
Express的工具会生成一个默认的目录结构,我们在此基础上开发就可以。
默认的目录结构大概如下:
.
├── app.js
├── bin
│ └── www
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ └── style.css
├── routes
│ ├── index.js
│ └── users.js
└── views
├── error.ejs
└── index.ejs
bin下的www是启动脚本;public用来提供web页面的静态资源;routes文件夹下是请求路由的代码;views是页面模板文件。
接下来进入到server目录安装依赖
cd avalon
npm install save
启动server
在server目录下运行命令就可以启动服务了。
node ./bin/www
Mock接口数据
Mock数据的功能是最好实现的,单纯使用Node.js就可以了。引入Express框架可以更方便的配置路由。
假设我们的接口路径是:
www.test.com/api/business_one/some.action
修改的步骤如下:
添加接口的路由配置
在app.js中
var businessOneRouter = require('./routes/router_one');
app.use('/api', businessOneRouter);
添加路由代码
接下来在routes文件夹下添加名为router_one.js的文件
var express = require('express');
var router = express.Router();
var result = {
"data": {
"location": "北京",
"lat": "39.90498734",
"lon": "116.40528870"
},
"status": "ok"
};
router.get('/business_one/some.action', function(req, res, next) {
res.send(result);
});
module.exports = router;
这样就完成了接口数据的mock。
接口转发
接口转发流程
接下来实现接口的转发。
为了避免其他应用也通过调试server转发,带来大量无效数据。因此与通用的抓包工具不同,我们仅让待开发的App请求调试server——通过更改debug版本中的服务器host实现。这样也就不需要手机或PC端配置代理了。
手机端发来请求以后,server向后端发起真正的请求,保持Header及参数与客户端完全一致,将host替换为真正的服务器地址。接收到服务端返回结果后,同样将Header与数据原样返回给客户端。
这一大致流程如下:
客户端发起请求–>调试server接收–>调试server向后端发起真正请求–>后端返回结果–>调试server将结果返回给客户端
为了方便描述,下面我们使用 cnodejs.org 与 v2ex.com 两个网站公开的api作为测试接口。
封装转发模块
我们将转发封装为模块,向外暴露一个接口即可。在项目下创建文件 proxyHelper.js
。
首先定义一个转发的入口方法,供我们在路由中调用:
function proxyRequest(req, res, hostStr, method) {
let options = optionFactoryWithHost(req, hostStr); // 生成请求配置
if (method === 'https') {
// https的转发
} else {
// http的转发
}
}
req 与 res 均为router回调传递进来的参数。考虑到后台接口的服务可能不同,在这里需要提供服务器地址。此外为支持http与https两种方式访问,这里也通过参数来进行处理。
这个接口对外暴露,直接在 router
里使用:
router.get('/api/nodes/show.j