【Go】Go Swagger 生成和转 openapi 3.0.3

server/2024/12/2 7:06:45/

本文档主要描述在 gin 框架下用 gin-swagger 生成 swagger.json 的内容,中间猜的坑。以及,如何把 swagger 2.0 转成 openapi 3.0.3

下面操作均在项目根目录下执行

swagger_20_3">生成 swagger 2.0

swagger_5">import swagger
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

main.go 或者 main 函数所在代码内 import 上面 go get 的包

import "github.com/swaggo/gin-swagger" // gin-swagger middleware
import "github.com/swaggo/files" // swagger embed files
通用 API 注释

在 main.go 或者 main 函数所在代码内添加

具体可以添加的注释见:https://github.com/swaggo/swag?tab=readme-ov-file#general-api-info

// @title           Swagger Example API
// @version         1.0
// @description     This is a sample server celler server.
// @termsOfService  http://swagger.io/terms/// @contact.name   API Support
// @contact.url    http://www.swagger.io/support
// @contact.email  support@swagger.io// @license.name  Apache 2.0
// @license.url   http://www.apache.org/licenses/LICENSE-2.0.html// @host      localhost:8080
// @BasePath  /api/v1
给 controller 接口加注释

具体可以添加的注释见:https://github.com/swaggo/swag?tab=readme-ov-file#api-operation

// Ksd 人声分离接口
//  @Summary      人声分割
//  @Description  传入语音来做人声分割
//  @Tags         ksd
//  @Accept       mpfd
//  @Produce      json
//  @Param        json   body      KsdReq true   "KsdReq"
//  @Response     200       {object}   CommonResp{data=KsdResp}
//  @Router       /aihc/v1/speaker/ksd [post]
func Ksd(ctx *gin.Context) {}

KsdReq 和 CommonResp 是自己定义的 struct,可以直接引用

如果是嵌套的,比如我的 CommonResp 是:

type CommonResp struct {Code int `json:"code"`Msg  string `json:"msg"`Data interface{} `json:"data"`
}

那对应接口返回值就可以用 CommResp{data=KsdResp} 来赋值,出来的网页就会带上这个 KsdResp

swagger_docs_73">构建 swagger docs

在执行 swag 前先 install

go install github.com/swaggo/swag/cmd/swag@latest

再调用下面指令生成 docs 目录

swag init
问题
  1. 如果 main 函数所在文件不叫 mian.go

    比如我的 main 函数在 speaker-svc.go

    swag init -g speaker-svc.go
    
  2. Error parsing type definition

    如果出现这个,可能是你确实类型写错了,另一个就是缺少下面两个参数。就是要解析目录中的 go 源文件,以及解析 internal 包中的 go 文件。

    swag init --parseDependency --parseInternal
    
  3. swagger ‘LeftDelim’ unknow

    更新 swag 包

    go get -u github.com/swaggo/swag
    

最后指令,我用的是

swag init -g speaker-svc.go --parseDependency --parseInternal
导入 docs 目录

如果不加打开页面会出现:Fetch error Internal Server Error doc.json

在 main.go 或者 main 函数的代码内导入生成的 docs。path 是你项目的根目录,或者你放到 pkg 下面或者哪里。

import "/path/docs"
swagger_129">路由添加 swagger

r 是 gin.New()

 r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
验证

http://localhost:8080/swagger/index.html

在这里插入图片描述


openapi_301_146">转换 openapi 3.0.1

swagger_converter_148">方法1:swagger converter

要转换成 3.0.0 是因为最近在尝试,把接口导入 LLMOps 的插件里面,都需要 openapi 的 spec,所以就想说找一下。找了很多方式,最快捷的还是用官方自带的 swag convertor。调用里面的接口,或者用页面的测试,都可以。输入就是上面生成的 swagger.json,输出就是 openapi 的 spec,很明显的标志就是第一行会是 "openapi": "3.0.1",之前是 "swagger": "2.0"

https://converter.swagger.io/#/

在这里插入图片描述

这个网站可以私有化部署,所以可以部署到本地去,方法见:https://github.com/swagger-api/swagger-converter

方法2:封装转换代码

查看了 go-openapi 官方代码和 kin-openapi 做了整合,通过对生成的 swagger.json 做转换

代码见:swagger2openapi3

后面为了方便,打算把 swag 那个工具改一下,把输出的 swagger.json 直接调这个接口,然后生成,省的每次都贴来贴去。


如果有更好的方法或者其他错误,欢迎讨论。


http://www.ppmy.cn/server/41831.html

相关文章

【STM32 |新建一个工程】基于标准库(库函数)新建工程

目录 STM32开发方式 库函数文件夹 建工程步骤 库函数工程建立 建立工程总结 STM32开发方式 目前stm32的开发方式主要有基于寄存器的方式、基于标准库的方式(库函数的方式)、基于HAL库的方式基于库函数的方式是使用ST官方提供的封装好的函数&…

QT---day5,通信

1、思维导图 2、TCp 服务器 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QTcpServer> #include <QList> #include <QTcpSocket> #include <QMessageBox> #include <QDebug> #include <QTcpServer> QT_B…

学习MySQL(二):库表的操作

库的增删改查 增 -- 创建库 create database 库名 charset 字符编码; 删 -- 删除库 drop database 库名; 改 -- 修改字符编码 alter database 库名 charset 字符编码; # 注&#xff1a;一般只改字符编码&#xff0c;数据库名称是不能改的 查 -- 查询当前账户下所有的库…

AppBuilder低代码体验:构建雅思大作文组件

AppBuilder低代码体验&#xff1a;构建雅思大作文组件 ​ 在4月14日&#xff0c;AppBuilder赢来了一次大更新&#xff0c;具体更新内容见&#xff1a;AppBuilder 2024.04.14发版上线公告 。本次更新最大的亮点就是**新增了工作流&#xff0c;低代码制作组件。**具体包括&#x…

正点原子FreeRTOS学习笔记——列表与列表项

目录 一、什么是列表和列表项 1、概念 2、FreeRTOS代码 &#xff08;1&#xff09;列表 &#xff08;2&#xff09;列表项 &#xff08;3&#xff09;迷你列表项 二、列表与列表项初始化 1、列表初始化 2、列表项初始化 三、列表插入与删除列表项 1、原理解释 2、…

AD域服务器巡检指南

Active Directory (AD) 域服务器的巡检对于确保企业网络的安全性和高效运行至关重要。以下是针对AD域服务器巡检的关键活动和其重要性的优化描述&#xff1a; 保证系统安全&#xff1a; AD域服务器储存大量敏感数据&#xff0c;包括用户账户信息、策略和访问权限数据。定期巡检…

构建NFS远程共享存储

nfs-server:10.1.59.237 nfs-web:10..159.218 centos7,服务端和客户端都关闭防火墙和selinux内核防火墙&#xff0c;如果公司要求开启防火墙&#xff0c;那需要放行几个端口 firewall-cmd --add-port2049/tcp --permanent firewall-cmd --add-port111/tcp --permanent firew…

知识付费系统怎么操作的,培训机构怎么用老带新招生呢?

随着暑假竞争的日益剧烈&#xff0c;各类教育培训机构早已准备着各种招生活动&#xff0c;打算进一步进步学校的招生数量。但是也有很多招生问题在搅扰着学校的招生教师&#xff0c;其实一切的招生活动&#xff0c;都必需效劳于重生报名和老生续报!培训机构如何做好老带新招生?…