在上一篇文章《AnyProxy搭建HTTP(S)代理服务器构建Mock服务》中主要介绍了AnyProxy部署方法和基本的启动方式,本文主要介绍通过AnyProxy的自定义规则实现Mock服务构建的整体设计及示例分享。
AnyProxy的主要变化
AnyProxy4.0与3.x版本相比,其中最主要的改变是规则文件内的接口优化,在使用时需要注意版本,其他变化还包含:
- 规则文件全面支持Promise和Generator
- Web版界面重构
本文主要基于最新版本——AnyProxy4.0进行介绍,官网地址如下:
https://github.com/alibaba/anyproxy
AnyProxy4.0主要规则模块
summary
summary(): string | summary:string
规则模块的介绍描述,用于AnyProxy提示用户, 可以是函数,也可以是字符串。
beforeSendRequest
beforeSendRequest(requestDetail)
AnyProxy向服务端发送请求前,调用beforeSendRequest,进行请求参数内容修改或直接返回本地响应内容(不再继续请求流程)。
beforeSendResponse
beforeSendResponse(requestDetail, responseDetail)
AnyProxy向客户端发送请求前,调用beforeSendResponse,进行返回状态码、返回内容的修改。
beforeDealHttpsRequest
beforeDealHttpsRequest(requestDetail)
AnyProxy收到https请求时,调用beforeDealHttpsRequest,如果配置了全局解析https的参数,则AnyProxy会略过这个调用。同时只有返回true时,AnyProxy才会尝试替换证书,解析https请求,否则只做数据流转发,无法看到明文数据。
对于我们的Mock服务构建而言,AnyProxy的主要作用体现在接管某个API的响应,进行数据mock,因此主要使用beforeSendRequest规则模块。
AnyProxy代理转发请求处理流程
AnyProxy代理转发请求处理流程如下:
当http请求经过代理服务器时,其处理流程如下:
- AnyProxy收集请求所有参数,包括url、method、header、body等。
- AnyProxy调用规则模块beforeSendRequest方法,修改请求参数内容或返回本地响应内容,如果beforeSendRequest返回了本地响应内容,则立即把此响应返回到客户端(不再向服务端发送,请求流程结束)。
- 根据请求参数,向服务端发出请求,接收服务端响应。
- 调用规则模块beforeSendResponse方法,对响应内容进行修改。
- 把响应信息返回给客户端,请求流程结束。
当https请求经过代理服务器时,AnyProxy可以替换证书,对请求进行明文解析。
- 调用规则模块beforeDealHttpsRequest方法,如果返回true,则明文解析这个请求,否则请求不处理。
- 被明文解析后的https请求,处理流程同http一致。未明文解析请求不会再进入规则模块做处理。
基于AnyProxy构建Mock服务的整体设计
AnyProxy构建Mock服务的整体设计如下:
抽取公共配置文件、Mock接口配置、本地响应配置实现与代理转发规则(js规则文件)解耦(即数据驱动),通过灵活修改、添加配置,实现高效、灵活的Mock服务。
公共配置文件
公共配置文件,如Mock启停配置。
Mock接口配置
需要Mock的接口Url列表。
本地响应配置
明确需要Mock的接口Url与Response映射关系。
自定义规则文件
读取各配置文件,利用beforeSendRequest规则方法,实现对需要Mock接口直接返回本地对应的响应内容。
基于AnyProxy构建Mock服务的实现示例
示例主要步骤
- 利用Wiremock启动3个伪服务,作为测试服务接口。
- 将其中两个接口添加至对应配置文件中。
- 启动AnyProxy(修改代理服务器配置)。
- 通过Python requests请求3个服务,验证是否实现Mock。
1.启动伪服务
通过浏览器请求三个服务,响应结果如下:
通过Python requests请求三个服务,响应结果如下:
2.配置相关配置文件
配置/profile_v3/graphic/publish、/profile_v3/graphic/comment接口至Proxy_Api配置文件中。
配置如下Url与响应体映射信息至LocalResponse.json配置文件中。
3.启动AnyProxy
执行anyproxy -i --rule Proxy_Rule.js ,启动AnyProxy,如下。
4.Requests请求
利用Python的Requests模块,请求三个接口,查看对应接口是否Mock成功,结果如下。
如上,我们实现了基于AnyProxy的Mock服务构建。
若对你有所帮助,欢迎大家评论、留言。