swagger新玩法 - 让你API接口开发原地起飞

news2024/9/20 23:55:48

作为Java后台接口开发人员,无论对对接方是前端还是第三方,很多时候我们在文档和代码两头都需要费心,而做到自动的同步将会非常省心。本教程将带你领略下如何借助swagger官方提供的新玩法,让你的API接口开发原地起飞,甚至实现0对接,让你多出几倍的上班摸鱼时间来消遣或者学习新技术。

文章目录

    • 你可能还在这么干
    • 新解决方案的落地
    • 让API接口开发原地起飞
    • 初步实现
      • 生成器二次开发
      • oas定义入库
      • freemarker模板生成oas定义
      • 生成流程核心代码
    • 演示开发流程如何起飞
    • 后续计划
    • 收徒计划

你可能还在这么干

对于一些遗留系统,为了方便从代码同步文档,开发人员在编写API接口代码时还需要加上swagger注解,以方便项目部署好后一起提供出swagger文档。当然这种做法会让你的controller比较难看,维护起来也麻烦。弊端是先有代码才有文档,而且swagger注解方式产出的文档也有环境限制,对应用本身的服务暴露也是有隐患的。

对于新项目,大伙儿也许会用APIFox这样的API管理利器,会在上面建项目,然后编辑文档,代码这一块它还没有自己成熟的生成部署方案,还是依赖于第三方的代码生成器插件,生成的代码功能定制这块还不完善,因此大部分情况下,新项目还是要自己手写API接口声明代码。

新解决方案的落地

再说新方案,首先不得不提下现在慢慢被业界所接收和公认的API接口定义规范,这也是swagger官方提出的Open API Specification,简称oas。可以从官方文档地址查阅其定义规范,最新规范已经出到3.1.0了。基于该规范有官方和第三方的swagger文档可视化插件,新版本在界面上做了些优化。说到这里,我们的想法是,既然有了API文档定义的元数据,我们是否可以自己实现插件或者web界面,做更多的用户使用体验和功能增强方面的定制呢。当然是可以的!

另外,swagger团队也基于oas规范推出了开源代码生成器项目,对各种编程语言,包括服务端API提供方以及客户端的API消费方都提供了目标代码生成的选项。因此前面提到的代码和文档自动同步的问题,用一个oas规范的定义文件就两边都搞定了。

官方Swagger编辑器地址:https://editor-next.swagger.io/,修改源文件定义后,所见即所得,可以通过node包安装方式整合到前端项目中:

在这里插入图片描述

ideaopenAPI插件,也提供了这样的功能,只不过改了源文件需要重新打开:

在这里插入图片描述

另外,idea插件还提供了代码生成功能:

在这里插入图片描述

内置了OpenAPI GeneratorSwagger Codegen这两款主流的生成器,前者是在后者的开发上新的分支,且维护的更好,用到人更多,而作为二次开发,本人选择的还是后者。

让API接口开发原地起飞

咱们的目标很明确,先实现服务端API接口代码的0开发,再实现客户端调用API代码的0开发,都由定制的代码生成器来生成,最后自然就实现了0对接。而这个过程中,除了对开源代码生成器插件进行二次开发外,还要对oasAPI定义文件进行很好的管理,不用开发人员来写这个文件,而是通过web端界面来对API进行查看、操作、变更历史查看、对比,以及API接口调试。再往长远计划,因为界面操作尽量做到傻瓜式,各类人员都能操作,然后完善权限、修改操作的审核流程、API包部署流程。这对开发人员来说,API接口开发只要关注业务逻辑层的实现,真的是原地起飞。

初步实现

生成器二次开发

本人二次开发用的版本包含了:

在这里插入图片描述

二次开发的目的是修复原有生成器不支持的接口生成需求,比如表单对象提交的API从独立参数列表修复成生成表单DTO对象,DTO字段以及API接口参数的泛型类型缺失等等问题;对swagger文档调试和schema展示信息缺失的漏洞修复,比如表单对象提交的查询APIswagger内容类型注解的缺失,导致无法发送请求进行调试;定制代码生成需求,比如生成Lombok注解的DTO类、生成分页 接口、校验注解和自定义验证、分组验证等等支持。

这里以自定义校验为例,通过x-开头的定义项来扩展oas规范。

在这里插入图片描述

在这里插入图片描述

生成代码部分截图:

在这里插入图片描述

在这里插入图片描述
注意,考虑到实际API接口提供方需要给调用方提供统一的响应结构,这种要求是由各个业务系统自己定的,因此生成器不负责这块特异性的返回值类型统一包装,而是返回了后台处理的原始类型。而这部分可以交给web框架层做统一响应结构的处理。

oas定义入库

设计多张表来存储oas文件中定义的数据,将定义形式模板化,通过良好的数据库模型的设计,让用户有更好的理解。

最初版表设计:

在这里插入图片描述

初始化脚本截图:

在这里插入图片描述

这是一个查询API接口定义的例子:

在这里插入图片描述

freemarker模板生成oas定义

通过freemarker技术来基于数据库数据生成oas定义文件,交给生成器执行。

在这里插入图片描述

生成流程核心代码

这里只是完成了最初版的实现,因为生成器模块中用的日志框架和配置与本人的spring boot有冲突,日志输出有问题,待修复。

在这里插入图片描述

演示开发流程如何起飞

初步版本没有做web界面,只能走数据库dml脚本,后续接了前端界面就很方便了。用一个单元测试来一键生成代码,同时会有一个临时文件:

在这里插入图片描述

开发controller直接起飞,这里就查把controller的空实现代码生成出来了,借助于ide的生成选项页很快。controller类上只需要加一个@RestController注解,其他所有注解都在生成API接口时都做了,包含Spring MVC注解、校验注解、swagger注解、json注解等等。剩下的你只需要关注service接口调用即可。

在这里插入图片描述

再开发一个UserPersonalController来暂存和提交个人信息:

在这里插入图片描述

启动服务,可以访问到swagger在线文档:

在这里插入图片描述

在线调试,API定义中的自定义参数校验自动生效:

在这里插入图片描述

后续计划

  • 修复生成器和spring boot整合的日志冲突
  • 使用Vue3 + element plus开发web端项目
  • 数据库设计引入API的变更版本,以进一步实现历史记录追踪
  • 继续二次开发前端TS版的API调用端代码生成器,实现前后端0对接的理想

收徒计划

这个项目的定性可以作为企业内部API接口协同工具而具有很大的商业价值,但同时从0起步也是一个很好的收徒实训项目,可以锻炼到新人的前后端全栈开发能力,本人个人精力有限,也很愿意有偿带徒继续做这个项目,有感兴趣的小伙伴可以后台私信。大家加油!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

34.贪心算法1

0.贪心算法 1.柠檬水找零(easy) . - 力扣(LeetCode) 题目解析 算法原理 代码 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0;for (int x : bills) {if (x 5) // 5 元:直接收下…

4. Python之运算符

一. Python运算符 常用的运算符有:算述运算符,赋值运算符,比较运算述,逻辑运算符,位运算符等等。 1. 算述运算符 用于处理四则运算的符号,主要有: 运算符描述加法-减法*乘法/除法//整除%取余…

嵌入式DCMI摄像头功能调试方法

STM32F407芯片带有DCMI接口,在我们的核心板上已经将接口用18PIN的FPC座子引出。 这个接口可以接我们的OV2640接口。 本节我们开始调试摄像头。 16.1. DCMI DCMI接口是ST自己定义的接口。 Digital camera interface (DCMI),是意法半导体公司产品STM32F4xx系列芯片的快速摄像头…

【JavaEE初阶】多线程(5 单例模式 \ 阻塞队列)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 实例1: 单例模式 饿汉模式 懒汉模式 实例2:阻塞队列 生产者消费者模型 优点 ​编辑 代价 简单实现一个生产者消费者模型 Java标准库中的阻塞队列 ​编辑 模拟实现一…

面试官问:你如何看待加班?

面试官问:你如何看待加班? 面试官问:你如何看待加班?这类问题是比较常见的,出现频率相当高。有些同学看到这样的问题,就会断定这家公司估计是经常加班的,绝对的不能去!!…

通信工程学习:什么是PON无缘光纤网络

PON:无源光纤网络 PON(Passive Optical Network,无源光纤网络)是一种采用光分路器等无源光器件进行信号传输和分配的光纤接入技术。它利用光纤作为传输媒介,通过无源设备将光信号从中心局(如光线路终端OLT&…

中秋节特别游戏:给玉兔投喂月饼

🖼️ 效果展示 📜 游戏背景 在中秋这个充满诗意的节日里,玉兔因为贪玩被赶下人间。在这个温柔的夜晚,我们希望通过一个小游戏,让玉兔感受到人间的温暖和关怀。🐰🌙 🎮 游戏设计 人…

太阳能光伏板航拍红外图像缺陷分类数据集

太阳能光伏板航拍红外图像缺陷分类数据集 一、数据集简介 太阳能光伏板的性能直接影响到光伏发电系统的效率和可靠性。随着无人机和红外成像技术的发展,通过航拍红外图像对光伏板进行缺陷检测已成为一种高效且准确的方法。本数据集包含11种不同的缺陷分类&#xf…

【CPP】模板(后篇)

目录 13.1 非类型模板参数13.2 函数模板的特化13.3 类模板的特化13.4 模板的分离编译 这里是oldking呐呐,感谢阅读口牙!先赞后看,养成习惯! 个人主页:oldking呐呐 专栏主页:深入CPP语法口牙 13.1 非类型模板参数 顾名思义,非类型模板参数就是一个模板的参数,只不过不是类型,而…

第二十六篇——九地篇:九种形势的应对之道

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 地势的维度重新阐述了懂得人心的重要性,道久其归一为为别人。…

个人随想-gpt-o1大模型中推理链的一个落地实现

​首先祝大家中秋节快乐。 最近openai又推出了新的模型openai o1​还有它的mini版。官网的介绍,就是它的推理能力很强,比gpt-4o​有很大的提升。 最近也跟同行在聊这个o1,​看看落地方面有哪些可行性。在我们自己的实验上,把o1用…

Python画笔案例-052 绘制彩色递归六边形

1、绘制彩色递归六边形 通过 python 的turtle 库绘制 彩色递归六边形,如下图: 2、实现代码 绘制彩色递归六边形,以下为实现代码: """彩色递归六边形.py """ import turtledef draw_circle(radius,…

【自动化测试】移动app的分层测试以及自动遍历的基本概念

引言 移动应用的分层测试是一种系统化的测试方法,它将测试过程分解为不同的层次,以确保应用在每个层面上都符合设计要求和用户期望 文章目录 引言一、移动app的分层测试1.1 单元测试(Unit Testing)1.2 集成测试(Integr…

甲骨文创始人埃里森:人工智能终有一天会追踪你的一举一动

9月17日消息,据外电报道,甲骨文创始人拉里埃里森在甲骨文财务分析师会议上表示,他预计人工智能有一天将为大规模执法监控网络提供动力。“我们将进行监督。”他说。“每一位警察都将随时受到监督,如果有问题,人工智能会…

人工智能辅助汽车造型设计

随着科技的不断进步,人工智能(AI)在各个领域的应用越来越广泛,汽车设计行业也不例外。尤其在车辆外观造型设计中,AI正在成为设计师的重要助手,通过提供强大的工具和独特的创意方式,革新了传统设…

算法之搜索--最长公共子序列LCS

最长公共子序列&#xff08;longest common sequence&#xff09;:可以不连续 最长公共子串&#xff08;longest common substring&#xff09;&#xff1a;连续 demo for (int i 1;i<lena;i){for (int j 1;j<lenb;j){if(a[i-1]b[j-1]){dp[i][j]dp[i-1][j-1]1;}el…

神奇的Serializable接口,为什么有时候网络传输不用实现Serializable,有时候又需要?

大家好&#xff0c;这里是小奏,觉得文章不错可以关注公众号小奏技术 背景 其他大家在初学java的时候肯定是接触过Serializable接口的&#xff0c;这个接口是一个标记接口&#xff0c;没有任何方法&#xff0c;只是一个标记&#xff0c;用来标记一个类可以被序列化&#xff0c;…

深入解析代理模式:静态代理、JDK 动态代理和 CGLIB 的全方位对比!

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了对象的替身&#xff0c;即代理对象来控制对实际对象的访问。通过代理对象&#xff0c;可以在不修改目标对象的情况下&#xff0c;扩展或控制其功能。例如&#xff0c;代理模式可以用于延…

JDBC的介绍和连接MySQL数据库

目录 1. 为什么学习JDBC 1.1 数据存储​编辑​编辑 1.2 数据操作​编辑 2. JDBC概述 2.1 JDBC概念 2.2 JDBC 核心组成 3. 实现 JDBC 3.1 JDBC 搭建步骤 3.2 详细演示 3.3 核心API 3.3.1 Driver​ 3.3.2 Connection​ 3.3.3 Statament​ 3.3.4 PreparedStatement …

嵌入式单片机中can总线调试方法

大家好,今天将向大家介绍如何使用STM32F4自带的CAN控制器实现两个开发板之间的CAN通信。 1.CAN CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的…