测试开发【Mock平台】12基础:拦截器服务实现(三) 接口匹配逻辑

【Mock平台】为系列测试开发教程,从0到1编码带你一步步使用Spring Boot 和 Antd React框架完成搭建一个测试工具平台,希望作为一个实战项目对各位的测试开发学习之路有帮助,关注公众号发送“mock”获取github项目源码地址,大奇一个专注测试技术干货原创与分享的家伙。

上两节我们学习了 HandlerInterceptor 和 WebMvcConfigurer 基础知识,接下我们就可以利用此模块进行拦截服务的逻辑实现了。在此之前我这边先给出一个本项目要实现的一个简化版逻辑处理图,大家可以根据此图先自己构思所要设计数据库表和代码块。
网关思维导图

路径匹配数据表

通过创建一个接口基本要素的表来对mock接口进行管理,其中方法、路径,状态码为最基本字段,其他选项则根据需要进行扩展。比如我这里有标签进行一级分类,是否其中,以及在没有规则匹配的默认返回值等。

create table mock_api
(api_id               int auto_increment                 primary key,api_tag_id           int                                null comment '接口标签',api_project_id       int                                null comment '所属项目',api_title            varchar(50)                        null comment '自定义名称',api_method           varchar(10)                        null comment '接口方法',api_path             varchar(200)                       null comment '接口路径',api_enabel           tinyint                            null comment '是否启用',api_desc             varchar(100)                       null comment '描述',api_response_code    int                                null comment '返回状态码',api_response_default text                               null comment '接口默认值,用户没有规则的默认返回',api_create_user      varchar(50)                        null,api_create_date      datetime default CURRENT_TIMESTAMP null,api_update_user      varchar(50)                        null,api_update_date      datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP
)comment '接口管理表';

表创建完后我们再往里插入两条数据方便后边的接口开发调试。
在这里插入图片描述

路径匹配逻辑代码

在之前的分享中已经讲过层级架构和Spring Boot接口请求的基本套路,分别创建实体类和服务类。

实体类

编写数据库表mock_api的字段匹配的实体类。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class QMockApiEntity extends QBaseEntity implements Serializable {private Long id;private Long tagId;private Long projectId;private String title;private String method;private String path;private Integer enable;private String desc;private Integer resCode;private JSONObject resDefault;}

基于返回对象QMockApiEntity在QMockService写个待实现业务处理方法。
本项目中查询返回的是一个list,在后续的逻辑处理根据数据进行判断。其实正常情况下如果前后端实现时,控制了多条件下的不能重复录入,那么这里完全可以只返回单对象。

@Service("QMockService")
public class QMockService{public List<QMockApiEntity> selectApiByPath(String path, String method) {return null;}
}

数据操作

紧接着就是要写个条件查询语句,为了快速实现验证,我们这里先只通过 api_pathapi_method 两个参数进行条件查询。
因为查询SQL相对简单,这里我们直接用@select注解完成查询,多加一个@Results进行数据类型和JAVA中的类型绑定和转换。

@Mapper
public interface QMockApiMapper {@Select("SELECT * from mock_api WHERE api_path = #{path} AND api_method=#{method};")@Results(id = "apiMap",value = {@Result(column = "api_id", property = "id"),@Result(column = "api_tag_id", property="tagId"),@Result(column = "api_project_id", property="projectId"),@Result(column = "api_title", property="title"),@Result(column = "api_method", property = "method"),@Result(column = "api_path", property="path"),@Result(column = "api_enable", property="enable"),@Result(column = "api_desc", property = "desc"),@Result(column = "api_response_code", property="resCode"),@Result(column = "api_response_default", property="resDefault",jdbcType = JdbcType.VARCHAR, typeHandler = JSONObjectTypeHandler.class),@Result(column = "api_create_user", property = "createUser"),@Result(column = "api_create_date", property = "createDate"),@Result(column = "api_update_user", property = "updateUser"),@Result(column = "api_update_date", property = "updateDate")})List<QMockApiEntity> getMockApiListByPath(String path, String method);}

特别指出Results标记中有一处 typeHandler = JSONObjectTypeHandler.class 是用到了MyBatis的自定义类型处理器,代码如下,具体技术点大家可以先自行学习下,后边有扩展内容的也会给大家说一说。

@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JSONObjectTypeHandler extends BaseTypeHandler<JSONObject> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, String.valueOf(parameter.toJSONString()));}@Overridepublic JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {String sqlJson = rs.getString(columnName);if (null != sqlJson){return JSONObject.parseObject(sqlJson);}return null;}@Overridepublic JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String sqlJson = rs.getString(columnIndex);if (null != sqlJson){return JSONObject.parseObject(sqlJson);}return null;}@Overridepublic JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String sqlJson = cs.getString(columnIndex);if (null != sqlJson){return JSONObject.parseObject(sqlJson);}return null;}
}

业务逻辑

以上都准备好后,就可以调用逻辑了,注意这里之前说过因为网关服务没有太多的类和方法,所以没有写接口类,以及将所有service实现也都集成在一个类中了。

@Service("QMockService")
public class QMockService{@Autowiredprivate QMockApiMapper qMockApiMapper;public List<QMockApiEntity> selectApiByPath(String path, String method) {List<QMockApiEntity> mockApiEntities = qMockApiMapper.getMockApiListByPath(path, method);return mockApiEntities;}
}

截止到目前所有的JAVA代码文件的目录结构供大家参考如下:
在这里插入图片描述

最后一个步骤,对其之前的文章中的QMockInterceptor.java进行升级改造,将拦截返回的逻辑处理部分变更调用API服务类,实现真正的配置查询和返回。

@Slf4j
public class QMockInterceptor implements HandlerInterceptor{@AutowiredQMockService qMockService;public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 此处省略重复代码... //JSONObject resResult = new JSONObject();Integer resCode = 200;JSONObject reqParamsOrBody = null;// 匹配查询URI的数据,当等于1的时候进行规则查询,否则其他错误请求处理List<QMockApiEntity> mockApiEntities = qMockService.findApiByPath(requestURI, requestMethod);if(mockApiEntities.size() == 1) {// 唯一匹配返回默认配置值resResult = mockApiEntities.get(0).getResDefault();resCode = mockApiEntities.get(0).getResCode();} else if (mockApiEntities.size() > 1) {resResult.put("code", 5000);resResult.put("data", new JSONObject());resResult.put("msg", "MOCK匹配多个URI请检查配置");}else {resResult.put("code", 5000);resResult.put("data", new JSONObject());resResult.put("msg", "MOCK未匹配任何URI请先添加把");}}

保存全部代码,启动网关服务做个PostMan请求验证下接口拦截功能是否一切OK
在这里插入图片描述

至此,本篇教程实现到这里,基本上我们已经实现一个mock网关服务的从请求-拦截-匹配-返回结果的这样的流程。在下一篇中我们去实现更深一层的规则匹配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478109.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何确定分库还是 分表?

分库分表 分库分表使用的场景不一样&#xff1a; 分表因为数据量比较大&#xff0c;导致事务执行缓慢&#xff1b;分库是因为单库的性能无法满足要求。 分片策略 1、垂直拆分 水平拆分 3 范围分片&#xff08;range&#xff09; 垂直水平拆分 4 如何解决数据查询问题&a…

数据可视化利器:五款必备工具推荐

在数据可视化的世界里&#xff0c;工具的选择往往决定了工作的效率和效果。作为一名资深的数据可视化用户&#xff0c;我尝试并使用了众多的数据可视化工具。今天&#xff0c;我想向大家推荐五款我认为最好用、最实用的数据可视化工具。 1. 山海鲸可视化 山海鲸可视化以其强大…

ansible剧本中的角色

1 roles角色 1.1 roles角色的作用&#xff1f; 可以把playbook剧本里的各个play看作为一个角色&#xff0c;将各个角色打的tasks任务、vars变量、template模版和copy、script模块使用的相关文件等内容放置在指定角色的目录里统一管理&#xff0c;在需要的时候可在playbook中使…

删除挖矿木马yaya病毒

文章目录 挖矿木马&#xff08;yaya&#xff09; 挖矿木马&#xff08;yaya&#xff09; 参考文档&#xff1a;解决挖矿 将隐藏内核模块可见 kill -63 0 查看隐藏的内核模块nonono cat /proc/modules |head -n 10 删除内核模块 rmmod nonono 结束挖矿进程 使用top命令查…

浅谈js事件机制

事件是什么&#xff1f;事件模型&#xff1f; 原始事件模型&#xff08;DOM0级&#xff09; HTML代码中指定属性值&#xff1a;在js代码中指定属性值&#xff1a;优点&#xff1a;缺点&#xff1a; IE 事件模型DOM2事件模型 对事件循环的理解 宏任务&#xff08;Macrotasks&…

PWM功能介绍 和配置

泰山派默认提供了3组PWM的GPIO &#xff0c; 为了检测PWM的输出&#xff0c;我们可以配合逻辑分析仪来查看效果&#xff0c;或者搭配STC8的LED灯 PWM 测试 列举所有的PWM设备&#xff1a; # 查找所有有pwm名称的文件 find / -name "pwm" # pwm4: pwmfe6e0000 edp屏幕…

短剧弯道超车拿下2024开年第一爆,谁在打造新的暴富神话?

2024开年第一爆竟然被一部土味小短剧拿下了。 春节期间,无论是刷抖音还是微博,都能看到《我在八零年代当后妈》这部微短剧,女大学生穿越到八十年代当后妈,集狗血、土味、爽点于一体,让人相当上头。 春节档长视频平台爱、优、腾都拿出了当家大戏抢夺剧集市场,没想到被短…

人机工程学和人机交互理论:智能座舱设计

hello家人们...本人熟悉PS、Xd、Ai、Sketch、Figma、墨刀、即时设计、mastergo、Pixso等行业设计软件以及前端开发等技能&#xff0c;拥有10年的UI经验&#xff0c;我们可以通过关注评论私信交流以帮助到您解决UI工作中的烦恼&#xff01;谢谢 人机工程学与人机交互理论&#x…

Gin框架: HTML模板渲染之配置与语法详解

Gin的HTML模板配置 1 &#xff09;单一目录的配置 配置模板目录&#xff0c;在与main.go同级下, 新建目录&#xff0c;下面二选一&#xff0c;仅作举例, 这里选择 tpls templatestpls 在 tpls 目录下新建 news.html <!-- 最简单的 --> <h1>News Page</h1>&l…

matplotlib图例使用案例1.1:在不同行或列的图例上添加title

我们将图例进行行显示或者列显示后&#xff0c;只能想继续赋予不同行或者列不同的title来进行分类。比较简单的方式&#xff0c;就是通过ax.annotate方法添加标签&#xff0c;这样方法复用率比较低&#xff0c;每次使用都要微调ax.annotate的显示位置。比较方便的方法是在案例1…

Python Flask高级编程之RESTFul API前后端分离(学习笔记)

Flask-RESTful是一个强大的Python库&#xff0c;用于构建RESTful APIs。它建立在Flask框架之上&#xff0c;提供了一套简单易用的工具&#xff0c;可以帮助你快速地创建API接口。Flask-RESTful遵循REST原则&#xff0c;支持常见的HTTP请求方法&#xff0c;如GET、POST、PUT和DE…

C# CAD2016 多边形顶点按方向重新排序

多边形顶点按方向重新排序 初始化多边形顶点集合 outerPoints 创建一个名为 outerPoints 的 List<Point2d>&#xff0c;用于存储多边形的所有顶点坐标。 计算多边形顶点集合的边界框&#xff08;BoundingBox&#xff09; 使用LINQ的Aggregate方法遍历整个outerPoints列表…