【Spring/Java项目】如何利用swagger-parser解析yaml中的api请求类型、注释、接口名等等(含示例代码)

手打不易,如果转摘,请注明出处!

注明原文:https://zhangxiaofan.blog.csdn.net/article/details/129167371


目录

前言

官方文档

项目配置

示例代码

测试文件

 解析代码

运行结果


前言

        用到这个工具是因为项目需要,本身项目比较多,swagger.yaml也很多,公司的管理平台无法直观的统计全部服务的yaml中的API,因此就用这个工具快速提取我们各个项目中的API信息,包括API名称、操作类型、请求类型等等。

官方文档

swagger-api 的使用官方文档:

https://github.com/swagger-api/swagger-parser

项目配置

pom.xml : 

        <dependency><groupId>io.swagger.parser.v3</groupId><artifactId>swagger-parser</artifactId><version>2.1.12</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.3</version></dependency>

示例代码

测试文件

测试文件名:

swagger-test1.yaml
swagger-test2.yaml

测试文件目录:

src/main/resources/swagger/test

 

第1个swagger文件:

src/main/resources/swagger/test/service1/swagger-test1.yaml

 第2个swagger文件:

src/main/resources/swagger/test/service2/swagger-test2.yaml

测试文件内容(方便测试,两个都是一样的):

swagger: '2.0'
info:title: ping testversion: '1.0'
host: 'localhost'
basePath: /test
schemes:- "https"
tags:- name: TestManagedescription: 测试管理
paths:/some/ping:get:tags:- TestManageoperationId: pingGetdescription: 一个测试方法parameters:- name: iin: bodydescription: query字段required: trueschema:$ref: './swagger/swagger-reference.yaml#/type'responses:'201':description: OK/some/ping2:post:tags:- TestManageoperationId: pingPostdescription: 一个测试方法2parameters:- name: numin: querydescription: 数量required: truetype: integerformat: int32responses:'201':description: OK

 解析代码

package util;import cn.hutool.core.util.ObjectUtil;
import io.swagger.parser.OpenAPIParser;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.PathItem;
import io.swagger.v3.oas.models.Paths;
import io.swagger.v3.parser.core.models.ParseOptions;
import io.swagger.v3.parser.core.models.SwaggerParseResult;
import lombok.extern.slf4j.Slf4j;import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;import java.io.File;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;@Slf4j
public enum SwaggerParseUtl {;/*** 待解析的文件目录*/private static final String RESOURCE_DIRECTORY = "E:\\JavaProject\\local\\JavaCoreTest\\src\\main\\resources\\swagger\\test";public static void main(String[] args) {List<String> fileList = new ArrayList<>();// 读取所有的 yaml 文件getFileList(RESOURCE_DIRECTORY, ".yaml", fileList);// 依次解析 yaml 文件for (String file : fileList) {String[] split = file.replace("\\", "/").split("/");// 文件名String fileName = split[split.length - 1];// 这里的 swagger.yaml 按服务名存放String serviceName = split[split.length - 2];parseSwaggerYaml("swagger/test", serviceName, fileName);}}/*** 解析方法** @param resourceRelativePath 目标文件在 resources 下的相对路径* @param serviceName          服务名* @param fileName             文件*/public static void parseSwaggerYaml(String resourceRelativePath, String serviceName, String fileName) {String filePath = resourceRelativePath + "/" + serviceName + "/" + fileName;ParseOptions options = new ParseOptions();options.setResolve(true);SwaggerParseResult result = new OpenAPIParser().readLocation(filePath, null, options);OpenAPI openAPI = result.getOpenAPI();Paths paths = openAPI.getPaths();for (Map.Entry<String, PathItem> entry : paths.entrySet()) {// url pathString path = entry.getKey();// apiPathItem pathItem = entry.getValue();Operation api = getOperation(pathItem);// request typePathItem.HttpMethod method = getMethod(pathItem);// operationIdString operationId = api.getOperationId();// 描述String description = "";if (!StringUtils.isEmpty(api.getDescription())) {description = api.getDescription();} else {description = api.getSummary();}String tag = "";if (!CollectionUtils.isEmpty(api.getTags())) {tag = api.getTags().get(0);}System.out.println(MessageFormat.format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}", serviceName, fileName,method, path, tag, operationId, description));}}/*** 获取请求方法类型*/private static PathItem.HttpMethod getMethod(PathItem pathItem) {Operation api = null;if (!ObjectUtil.isEmpty(pathItem.getGet())) {return PathItem.HttpMethod.GET;} else if (!ObjectUtil.isEmpty(pathItem.getPost())) {return PathItem.HttpMethod.POST;} else if (!ObjectUtil.isEmpty(pathItem.getPut())) {return PathItem.HttpMethod.PUT;} else if (!ObjectUtil.isEmpty(pathItem.getDelete())) {return PathItem.HttpMethod.DELETE;} else if (!ObjectUtil.isEmpty(pathItem.getPatch())) {return PathItem.HttpMethod.PATCH;} else {throw new RuntimeException("不支持的请求类型");}}/*** 获取 Operation Api*/private static Operation getOperation(PathItem pathItem) {Operation api = null;if (!ObjectUtil.isEmpty(pathItem.getGet())) {api = pathItem.getGet();} else if (!ObjectUtil.isEmpty(pathItem.getPost())) {api = pathItem.getPost();} else if (!ObjectUtil.isEmpty(pathItem.getPut())) {api = pathItem.getPut();} else if (!ObjectUtil.isEmpty(pathItem.getDelete())) {api = pathItem.getDelete();} else if (!ObjectUtil.isEmpty(pathItem.getPatch())) {api = pathItem.getPatch();} else {throw new RuntimeException("不支持的请求类型");}return api;}/*** 递归遍历所有文件** @param filePath 文件路径* @param suffix   指定的文件格式* @param fileList 获取的文件list*/private static List<String> getFileList(String filePath, String suffix, List<String> fileList) {File root = new File(filePath);// 非目录if (!root.isDirectory()) {fileList.add(root.getAbsolutePath());return fileList;}// 目录则递归遍历File[] files = root.listFiles();if (null != files) {for (File file : files) {if (file.isDirectory()) {// 递归xmlgetFileList(file.getAbsolutePath(), suffix, fileList);} else if (file.getName().contains(suffix)) {fileList.add(file.getAbsolutePath());}}}return fileList;}
}

运行结果

Connected to the target VM, address: '127.0.0.1:3983', transport: 'socket'
service1	swagger-test1.yaml	GET	/some/ping	TestManage	pingGet	一个测试方法
service1	swagger-test1.yaml	POST	/some/ping2	TestManage	pingPost	一个测试方法2
service2	swagger-test2.yaml	GET	/some/ping	TestManage	pingGet	一个测试方法
service2	swagger-test2.yaml	POST	/some/ping2	TestManage	pingPost	一个测试方法2
Disconnected from the target VM, address: '127.0.0.1:3983', transport: 'socket'Process finished with exit code 0

后面可以直接复制这个结果到 excel 编辑,或者用 Java 代码直接写到 excel 中都可以!

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

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

相关文章

Java9集合类新增功能

前言 Java8及Java9在集合Collection类中新增了一些很好用的新方法&#xff0c;能方便程序员更便捷的处理集合数据&#xff0c;本文对其中的一些方法进行总结 一. List 1.创建 // 传统方法List<String> list1 new ArrayList<>();list1.add("item1");li…

FPGA实验一:层次法设计组合电路(加法器)

目录 一、实验目的 二、实验要求 三、实验代码 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 3、下载测试结果及分析 五、实验心得 一、实验目的 &#xff08;1&#xff09;掌握基本组合逻辑电路的 FPGA实现&#xff1b; &#xff08;2&#xff09;学习 Verilo…

烂sql导致clickhouse集群memory_tracking直线飙升触发熔断

版 本 v e r s i o n 1 9 . 1 7 . 4 . 1 1 c l i c k h o u s e 集 群 &#xff0c; 主 要 存 日 志 数 据 与 监 控 数 据 。 架 构 为 4 台 主 机 1 2 个 实 例 数 &#xff0c; 数 据 为 单 副 本 。 近 日 &#xff0c; 该 c l i c k h o u s e 集 群 有 一 台 物…

Leetcode 数据库刷题记录

https://leetcode-cn.com/problemset/database/ 题目都是leetcode 上的可以点击题目会有相应的链接 每道题后面都应相应的难度等级&#xff0c;如果没时间做的话 可以在leetcode 按出题频率刷题&#xff0c;答案仅供参考 175. 组合两个表 难度简单 SQL架构 表1: Person ---…

深入理解什么是端口(port)

每当看到有人的简历上写着熟悉 TCP/IP, HTTP 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意… 所以这次就来谈谈 端口(port) , 这个熟悉的陌生人. 在此过程中, 还会谈谈 间接层, naming service 等概念, IoC, 依赖倒置 等原则以及 TCP …

服务器配置静态IP

服务器配置静态IP 一、前期准备二、配置静态IP 将服务器配置为使用静态IP地址。这将使服务器拥有一个永久的IP地址&#xff0c;而不会在每次启动时更改。为此&#xff0c;您需要编辑网络配置文件并将服务器的IP地址添加到其中。详细步骤如下&#xff1a; 一、前期准备 请在配置…

一篇搞懂socket、websocket、http协议及其使用

socket 介绍socket之前先看小编的这篇文章报文、报文段、数据包、帧、比特、字符、字节&#xff0c;与编码 在网络传输中数据都是经过多层封装的&#xff0c;在协议簇中最低层次为传输层才可以传输数据。再往底层就是面向计算机硬件和网络的部分了。例如常使用的ping baidu.co…

查看windows上的dll内容

1、安装Visual Studio时选择c桌面开发和通用Windows平台开发 2、cmd运行在Visual Studio安装路径下的VC\Auxiliary\Build\vcvars64.bat 3、在这个窗口中运行dumpbin

【JVM内存模型】—— 每天一点小知识

&#x1f4a7; J V M 内存模型 \color{#FF1493}{JVM内存模型} JVM内存模型&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x…

如何修改Jupyter Notebook的默认目录和默认浏览器

一、修改默认目录 Jupyter Notebook的文件默认保存目录是C:\Users\Administrator&#xff0c;默认目录可在黑窗口中查看&#xff0c;如下图所示&#xff1a; 为了方便文档的管理&#xff0c;可将默认目录修改成自己想保存的地方。修改方法如下&#xff1a; 1、找到config文件 …

迅为RK3568开发板Buildroot 系统自启动 QT 程序

本小节将讲解如何开机自启动 QT 程序。 在设置自启动 QT 程序之前&#xff0c;首先要编译好 QT 可执行程序&#xff0c;完成以下两步。 1、 已经根据 03_【北京迅为】itop-3568 开发板快速使用编译环境 ubuntu18.04 v1.0.doc 第 10 章节进行了 QT 程序的交叉编译 2、 将交叉…

SpringCloud(2) 注册中心Eureka、Nacos

目录 1.背景2.Eureka 注册中心3.Nacos 注册中心4.常见面试题1&#xff09;服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现服务注册发现&#xff1f;2&#xff09;Nacos 和 Eureka 有什么区别&#xff1f; 1.背景 注册中心是微服务中必须要使用的组件&#xff0c;…