使用Swagger生成 API 文档(go语言示例)

article/2025/3/6 20:44:25

Swagger 介绍

在这里插入图片描述

Swagger 是一套围绕 OpenAPI 规范构建的开源工具,可以设计、构建、编写和使用REST API。Swagger 包含很多工具,其中主要的 Swagger 工具包括:

  • Swagger 编辑器:基于浏览器的编辑器,可以在其中编写 OpenAPI 规范,并实时预览API 文档。https://editor.swagger.io 就是一个 Swagger 编辑器,你可以尝试在其中编辑和预览 API 文档。
  • Swagger UI:将 OpenAPI 规范呈现为交互式 API 文档,并可以在浏览器中尝试 API调用。
  • Swagger Codegen:根据 OpenAPI 规范,生成服务器存根和客户端代码库,目前已涵盖了 40 多种语言。

Swagger 和 OpenAPI 的区别

OpenAPI 是一个 API 规范,它的前身叫 Swagger 规范,通过定义一种用来描述 API 格式或 API 定义的语言,来规范 RESTful 服务开发过程,目前最新的 OpenAPI 规范是OpenAPI 3.0(也就是 Swagger 2.0 规范)。

OpenAPI 规范规定了一个 API 必须包含的基本信息,这些信息包括:

  • 对 API 的描述,介绍 API 可以实现的功能。
  • 每个 API 上可用的路径(/users)和操作(GET /users,POST /users)。
  • 每个 API 的输入 / 返回的参数。
  • 验证方法。
  • 联系信息、许可证、使用条款和其他信息。

所以,你可以简单地这么理解:OpenAPI 是一个 API 规范,Swagger 则是实现规范的工具。

另外,要编写 Swagger 文档,首先要会使用 Swagger 文档编写语法,因为语法比较多,这里就不多介绍了,你可以参考 Swagger 官方提供的OpenAPI Specification来学习。

用 go-swagger 来生成 Swagger API 文档

在 Go 项目开发中,我们可以通过下面两种方法来生成 Swagger API 文档:

第一,如果你熟悉 Swagger 语法的话,可以直接编写 JSON/YAML 格式的 Swagger 文档。建议选择 YAML 格式,因为它比 JSON 格式更简洁直观。

第二,通过工具生成 Swagger 文档,目前可以通过swaggo-swagger两个工具来生成。

对比这两种方法,直接编写 Swagger 文档,不比编写 Markdown 格式的 API 文档工作量小,我觉得不符合程序员“偷懒”的习惯。所以,本专栏我们就使用 go-swagger 工具,基于代码注释来自动生成 Swagger 文档。为什么选 go-swagger 呢?有这么几个原因:

  • go-swagger 比 swag 功能更强大:go-swagger 提供了更灵活、更多的功能来描述我们的 API。

  • 使我们的代码更易读:如果使用 swag,我们每一个 API 都需要有一个冗长的注释,有时候代码注释比代码还要长,但是通过 go-swagger 我们可以将代码和注释分开编写,一方面可以使我们的代码保持简洁,清晰易读,另一方面我们可以在另外一个包中,统一管理这些 Swagger API 文档定义。

  • 更好的社区支持:go-swagger 目前有非常多的 Github star 数,出现 Bug 的概率很小,并且处在一个频繁更新的活跃状态。

你已经知道了,go-swagger 是一个功能强大的、高性能的、可以根据代码注释生成Swagger API 文档的工具。除此之外,go-swagger 还有很多其他特性:

  • 根据 Swagger 定义文件生成服务端代码。
  • 根据 Swagger 定义文件生成客户端代码。
  • 校验 Swagger 定义文件是否正确。
  • 启动一个 HTTP 服务器,使我们可以通过浏览器访问 API 文档。
  • 根据 Swagger 文档定义的参数生成 Go model 结构体定义。

可以看到,使用 go-swagger 生成 Swagger 文档,可以帮助我们减少编写文档的时间,提高开发效率,并能保证文档的及时性和准确性。

这里需要注意,如果我们要对外提供 API 的 Go SDK,可以考虑使用 go-swagger 来生成客户端代码。但是我觉得 go-swagger 生成的服务端代码不够优雅,所以建议你自行编写服务端代码。

目前,有很多知名公司和组织的项目都使用了 go-swagger,例如 Moby、CoreOS、Kubernetes、Cilium 等。

安装 Swagger 工具

go-swagger 通过 swagger 命令行工具来完成其功能,swagger 安装方法如下:

$ go get -u github.com/go-swagger/go-swagger/cmd/swagger
$ swagger version
dev

swagger 命令行工具介绍

swagger 命令格式为swagger [OPTIONS] 。可以通过swagger -h查看swagger 使用帮助。swagger 提供的子命令及功能见下表:
在这里插入图片描述

如何使用 swagger 命令生成 Swagger 文档?

go-swagger 通过解析源码中的注释来生成 Swagger 文档,go-swagger 的详细注释语法可参考官方文档。常用的有如下几类注释语法:

在这里插入图片描述

解析注释生成 Swagger 文档

swagger generate 命令会找到 main 函数,然后遍历所有源码文件,解析源码中与Swagger 相关的注释,然后自动生成 swagger.json/swagger.yaml 文件。

这一过程的示例代码为gopractise-demo/swagger。目录下有一个 main.go 文件,定义了如下 API 接口:

package main
import (
"fmt"
"log"
"net/http"
"github.com/gin-gonic/gin"
"github.com/marmotedu/gopractise-demo/swagger/api"
// This line is necessary for go-swagger to find your docs!
_ "github.com/marmotedu/gopractise-demo/swagger/docs"
)
var users []*api.User
func main() {
r := gin.Default()
r.POST("/users", Create)
r.GET("/users/:name", Get)
log.Fatal(r.Run(":5555"))
}
// Create create a user in memory.
func Create(c *gin.Context) {
var user api.User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": err.Error(), "code": 10
return
}
for _, u := range users {
if u.Name == user.Name {
c.JSON(http.StatusBadRequest, gin.H{"message": fmt.Sprintf("user %
return
}
}
users = append(users, &user)
c.JSON(http.StatusOK, user)
}
// Get return the detail information for a user.
func Get(c *gin.Context) {
username := c.Param("name")
for _, u := range users {
if u.Name == username {
c.JSON(http.StatusOK, u)
return
}
}
c.JSON(http.StatusBadRequest, gin.H{"message": fmt.Sprintf("user %s not exist}

main 包中引入的 User struct 位于 gopractise-demo/swagger/api 目录下的user.go文件:

// Package api defines the user model.
package api
// User represents body of User request and response.
type User struct {
// User's name.
// Required: true
Name string `json:"name"`
// User's nickname.
// Required: true
Nickname string `json:"nickname"`
// User's address.
Address string `json:"address"`
// User's email.
Email string `json:"email"`
}

// Required: true说明字段是必须的,生成 Swagger 文档时,也会在文档中声明该字段是必须字段。

为了使代码保持简洁,我们在另外一个 Go 包中编写带 go-swagger 注释的 API 文档。假设该 Go 包名字为 docs,在开始编写 Go API 注释之前,需要在 main.go 文件中导入docs 包:

_ “github.com/marmotedu/gopractise-demo/swagger/docs”

通过导入 docs 包,可以使 go-swagger 在递归解析 main 包的依赖包时,找到 docs包,并解析包中的注释。

在 gopractise-demo/swagger 目录下,创建 docs 文件夹:

$ mkdir docs
$ cd docs

在 docs 目录下,创建一个 doc.go 文件,在该文件中提供 API 接口的基本信息:

// Package docs awesome.
//
// Documentation of our awesome API.
//
// Schemes: http, https
// BasePath: /
// Version: 0.1.0
// Host: some-url.com
//
// Consumes:
// - application/json
//
// Produces:
// - application/json
//
// Security:
// - basic
//
// SecurityDefinitions:
// basic:
// type: basic
//
// swagger:meta
package docs

Package docs 后面的字符串 awesome 代表我们的 HTTP 服务名。Documentation ofour awesome API是我们 API 的描述。其他都是 go-swagger 可识别的注释,代表一定的意义。最后以swagger:meta注释结束。

编写完 doc.go 文件后,进入 gopractise-demo/swagger 目录,执行如下命令,生成Swagger API 文档,并启动 HTTP 服务,在浏览器查看 Swagger:

$ swagger generate spec -o swagger.yaml
$ swagger serve --no-open -F=swagger --port 36666 swagger.yaml
2020/10/20 23:16:47 serving docs at http://localhost:36666/docs

-o:指定要输出的文件名。swagger 会根据文件名后缀.yaml 或者.json,决定生成的文件格式为 YAML 或 JSON。

–no-open:因为是在 Linux 服务器下执行命令,没有安装浏览器,所以使 --no-open禁止调用浏览器打开 URL。

-F:指定文档的风格,可选 swagger 和 redoc。我选用了 redoc,因为觉得 redoc 格式更加易读和清晰。

–port:指定启动的 HTTP 服务监听端口。

打开浏览器,访问http://localhost:36666/docs ,如下图所示:
在这里插入图片描述
如果我们想要 JSON 格式的 Swagger 文档,可执行如下命令,将生成的 swagger.yaml转换为 swagger.json:

$ swagger generate spec -i ./swagger.yaml -o ./swagger.json

接下来,我们就可以编写 API 接口的定义文件(位于gopractise/demo/swagger/docs/user.go文件中):

package docs
import (
"github.com/marmotedu/gopractise-demo/swagger/api"
)
// swagger:route POST /users user createUserRequest
// Create a user in memory.
// responses:
// 200: createUserResponse
// default: errResponse
// swagger:route GET /users/{name} user getUserRequest
// Get a user from memory.
// responses:
// 200: getUserResponse
// default: errResponse
// swagger:parameters createUserRequest
type userParamsWrapper struct {
// This text will appear as description of your request body.
// in:body
Body api.User
}
// This text will appear as description of your request url path.
// swagger:parameters getUserRequest
type getUserParamsWrapper struct {
// in:path
Name string `json:"name"`
}
// This text will appear as description of your response body.
// swagger:response createUserResponse
type createUserResponseWrapper struct {
// in:body
Body api.User
}
// This text will appear as description of your response body.
// swagger:response getUserResponse
type getUserResponseWrapper struct {
// in:body
Body api.User
}
// This text will appear as description of your error response body.
// swagger:response errResponse
type errResponseWrapper struct {
// Error code.
Code int `json:"code"`
// Error message.
Message string `json:"message"`
}

user.go 文件说明:

  • swagger:route:swagger:route代表 API 接口描述的开始,后面的字符串格式为HTTP方法 URL Tag ID。可以填写多个 tag,相同 tag 的 API 接口在 Swagger 文档中会被分为一组。ID 是一个标识符,swagger:parameters是具有相同 ID 的swagger:route的请求参数。swagger:route下面的一行是该 API 接口的描述,需要以英文点号为结尾。responses:定义了 API 接口的返回参数,例如当 HTTP 状态码是 200 时,返回 createUserResponse,createUserResponse 会跟swagger:response进行匹配,匹配成功的swagger:response就是该 API 接口返回200 状态码时的返回。
  • swagger:response:swagger:response定义了 API 接口的返回,例如
    getUserResponseWrapper,关于名字,我们可以根据需要自由命名,并不会带来任何不同。getUserResponseWrapper 中有一个 Body 字段,其注释为// in:body,说明该参数是在 HTTP Body 中返回。swagger:response之上的注释会被解析为返回参数的描述。api.User 自动被 go-swagger 解析为Example Value和Model。我们不用再去编写重复的返回字段,只需要引用已有的 Go 结构体即可,这也是通过工具生成Swagger 文档的魅力所在。
  • swagger:parameters:swagger:parameters定义了 API 接口的请求参数,例如userParamsWrapper。userParamsWrapper 之上的注释会被解析为请求参数的描述,// in:body代表该参数是位于 HTTP Body 中。同样,userParamsWrapper 结构体名我们也可以随意命名,不会带来任何不同。swagger:parameters之后的createUserRequest 会跟swagger:route的 ID 进行匹配,匹配成功则说明是该 ID 所在 API 接口的请求参数。

进入 gopractise-demo/swagger 目录,执行如下命令,生成 Swagger API 文档,并启动 HTTP 服务,在浏览器查看 Swagger:

$ swagger generate spec -o swagger.yaml
$ swagger serve --no-open -F=swagger --port 36666 swagger.yaml
2020/10/20 23:28:30 serving docs at http://localhost:36666/docs

打开浏览器,访问 http://localhost:36666/docs ,如下图所示:
在这里插入图片描述

上面我们生成了 swagger 风格的 UI 界面,我们也可以使用 redoc 风格的 UI 界面,如下图所示:

在这里插入图片描述

go-swagger 其他常用功能介绍

上面,我介绍了 swagger 最常用的 generate、serve 命令,关于 swagger 其他有用的命令,这里也简单介绍一下。

1. 对比 Swagger 文档

$ swagger diff -d change.log swagger.new.yaml swagger.old.yaml
$ cat change.log
BREAKING CHANGES:
=================
/users:post Request - Body.Body.nickname.address.email.name.Body : User - Dele
compatibility test FAILED: 1 breaking changes detected

2. 生成服务端代码

我们也可以先定义 Swagger 接口文档,再用 swagger 命令,基于 Swagger 接口文档生成服务端代码。假设我们的应用名为 go-user,进入 gopractise-demo/swagger 目录,创建 go-user 目录,并生成服务端代码:

$ mkdir go-user
$ cd go-user
$ swagger generate server -f …/swagger.yaml -A go-user

上述命令会在当前目录生成 cmd、restapi、models 文件夹,可执行如下命令查看 server组件启动方式:

$ go run cmd/go-user-server/main.go -h

3. 生成客户端代码

在 go-user 目录下执行如下命令:

$ swagger generate client -f …/swagger.yaml -A go-user

上述命令会在当前目录生成 client,包含了 API 接口的调用函数,也就是 API 接口的 Go SDK。

4. 验证 Swagger 文档是否合法

$ swagger validate swagger.yaml
2020/10/21 09:53:18
The swagger spec at “swagger.yaml” is valid against swagger specification 2.0

5. 合并 Swagger 文档

$ swagger mixin swagger_part1.yaml swagger_part2.yaml

IAM Swagger 文档

IAM 的 Swagger 文档定义在iam/api/swagger/docs目录下,遵循 go-swagger 规范进行定义。

iam/api/swagger/docs/doc.go文件定义了更多 Swagger 文档的基本信息,比如开源协议、联系方式、安全认证等。

更详细的定义,你可以直接查看 iam/api/swagger/docs 目录下的 Go 源码文件。

为了便于生成文档和启动 HTTP 服务查看 Swagger 文档,该操作被放在 Makefile 中执行(位于iam/scripts/make-rules/swagger.mk文件中):

.PHONY: swagger.run
swagger.run: tools.verify.swagger
@echo “===========> Generating swagger API docs”
@swagger generate spec --scan-models -w $(ROOT_DIR)/cmd/genswaggertypedocs -
.PHONY: swagger.serve
swagger.serve: tools.verify.swagger
@swagger serve -F=redoc --no-open --port 36666 $(ROOT_DIR)/api/swagger/swagger.

Makefile 文件说明:

  • tools.verify.swagger:检查 Linux 系统是否安装了 go-swagger 的命令行工具
  • swagger,如果没有安装则运行 go get 安装。
  • swagger.run:运行 swagger generate spec 命令生成 Swagger 文档
    swagger.yaml,运行前会检查 swagger 是否安装。 --scan-models 指定生成的文档
    中包含带有 swagger:model 注释的 Go Models。-w 指定 swagger 命令运行的目录。
  • swagger.serve:运行 swagger serve 命令生成 Swagger 文档 swagger.yaml,运
    行前会检查 swagger 是否安装。

在 iam 源码根目录下执行如下命令,即可生成并启动 HTTP 服务查看 Swagger 文档:

$ make swagger
$ make serve-swagger
2020/10/21 06:45:03 serving docs at http://localhost:36666/docs

打开浏览器,打开http://x.x.x.x:36666/docs查看 Swagger 文档,x.x.x.x 是服务器
的 IP 地址,如下图所示:
在这里插入图片描述
IAM 的 Swagger 文档,还可以通过在 iam 源码根目录下执行go generate ./…命令
生成,为此,我们需要在 iam/cmd/genswaggertypedocs/swagger_type_docs.go 文件
中,添加//go:generate注释。如下图所示:

在这里插入图片描述

总结

在做 Go 服务开发时,我们要向前端或用户提供 API 文档,手动编写 API 文档工作量大,也难以维护。所以,现在很多项目都是自动生成 Swagger 格式的 API 文档。提到Swagger,很多开发者不清楚其和 OpenAPI 的区别,所以我也给你总结了:OpenAPI 是一个 API 规范,Swagger 则是实现规范的工具。

在 Go 中,用得最多的是利用 go-swagger 来生成 Swagger 格式的 API 文档。goswagger 包含了很多语法,我们可以访问Swagger 2.0进行学习。学习完 Swagger 2.0的语法之后,就可以编写 swagger 注释了,之后可以通过

$ swagger generate spec -o swagger.yaml

来生成 swagger 文档 swagger.yaml。通过

$ swagger serve --no-open -F=swagger --port 36666 swagger.yaml

来提供一个前端界面,供我们访问 swagger 文档。

为了方便管理,我们可以将 swagger generate spec 和 swagger serve 命令加入到
Makefile 文件中,通过 Makefile 来生成 Swagger 文档,并提供给前端界面。


http://chatgpt.dhexx.cn/article/SFQQXICY.shtml

相关文章

游戏开发者如何有效的编写游戏策划文档

在游戏开发过程中,项目开发团队的成员,几乎每天都会和游戏策划文档打交道,但是每个团队、每个人对策划文档的重视程度却各不相同。有的把游戏策划文档奉为游戏开发过程中的圣经,有的却认为使用策划文档,是一种非常低效率的行为。 …

接口文档工具全集

随着进入公司越来越久,发现好的文档工具,可以提升后端与前端的效率 整理文档工具集 ,其中Site的意思是 WebSite的Site,代表地址; 1,易文档Site 优势,通过示例,可以很清晰看到文档类型丰富,以及…

开发必备工具,快速生成接口文档、调用示例、mock配置

前言 开发中,接口文档很重要,特别是现在web开发都开始前后端分离了,更加需要一个好的接口文档。 那要怎么快速的出接口文档、调用示例、mock呢?如果太麻烦,很多人就不愿意去写了。 今天给大家介绍一个非常方便的工具…

layui官方文档保存

前言 在layui官网看到了它官网即将在2021.10.13停运,所以我决定将它的文档进行复制保存下来,以便于可以进行查阅 (不清楚会不会依然有官方文档,如果还有就当参考吧) 目录页 文章目录 前言目录页基础说明开始使用开始使…

接口文档编写工具

现在越来越流行前后端分离开发,使用ajax交互。所以api接口文档就变的十分有意义了,目前市场有哪些比较优秀的接口文档管理工具呢? 目录 1.MinDoc2.eoLinker3.apizza4.RAML5.其他工具1.Swagger2.Showdoc3.apidoc4.RAP5.APIJSON6.易文档 1.Min…

如何撰写需求文档

永远考虑那个拥有更强写作能力的人工欲善其事,必先利其器 markdown思维导图流程图 换位思考这个需求,「不做」闭环写作套路 铺垫下定义逻辑清晰说人话视角版本延续性 结语 Reading makes a full man, conference a ready man, and writing an exact man. 本文节选自《Springboo…

一份完整齐全的技术方案文档

2022年-[归一计划三期-用户中心三期第二阶段]技术方案 部门:基础架构部 时间:2022.02.25 1、背景 描述技术方案的背景 由于历史原因,旧服务存在很多代码不规范、冗余度高、扩展性差等问题,为了解决此类问题,以及将功…

易文档(yidocs),更简单的markdown静态文档生成模板

基本简介 yidocs(易文档),是在 vuepress 主题 vuepress-theme-hope 基础上,进一步简化使用的文档模板。 大部分配置和参数都有默认值,使用 yidocs(易文档)的用户,只需要填写必要的…

idea java配色方案_IDEA 主题配色方案+字体

IntelliJ IDEA被认为是当前Java开发效率最快的IDE工具。它整合了开发过程中实用的众多功能,几乎可以不用鼠标可以方便的完成你要做的任何事情,最大程度的加快开发的速度。 关于IDEA 主题配色方案 主题配色方案放置位置(Win7为例): C:\Users\A…

蓝绿色配色_蓝绿色部署

蓝绿色配色 传统上,我们通过替换当前版本来部署新版本。 旧版本停止了,新版本被替换了。 这种方法的问题是从旧版本停止到新版本完全运行之间的停机时间。 无论您尝试执行此过程的速度如何,都会有一些停机时间。 那可能只有一毫秒&#xff0c…

践行绿色发展理念,产业园区绿色转型发展之五大路径

近年来,我国产业园区蓬勃发展,成为区域经济的重要载体。但在这个发展过程中,一些产业园区面临着较大的能源资源及环境排放压力,影响到了园区的可持续发展。随着“碳中和”发展目标的提出,产业园区将走入绿色转型发展的…

色彩的基本配色方案

色彩是我们观察事物的第一认知,是最能触动我们感官的视觉元素。色彩可以激发我们的联想,刺激我们的情绪。在设计中,色彩的合理运用一直是个很重要的课题,在这里我总结了一些色彩部分的常识分享给大家。 一、色环 原色由红黄蓝组成…

IDEA自定义配色方案

整体颜色无主题,都是自己调整的,突然看上去色系比较多,但是多看一会就能清晰分辨出各个颜色的用途,整体配色属于鲜亮方案,元素颜色对比比较明显,个人感觉半灰阶看着不舒服。 Java文件配色方案 Mapper.xml配…

2023华数杯B题不透明制品最优配色方案设计(思路+Matlab代码+论文)

目录 思路 Matlab代码 论文框架 思路 问题1:计算着色剂在不同波长下K/S与浓度的关系 首先,问题1要求我们计算附件2中三种着色剂在不同波长下K/S与浓度的关系,并将关系式与拟合系数填写在表格中。为了完成这一步,我们需要以下步骤: 了解光学模型:阅读文献【1】《计…

前端常用的超赞的配色网站

1.中国风配色 zhongguose.com 超美的中国风配色,网站号称收集了最全的中国色,还有中英文互译,非常贴心,五星好评。 2.uiGradients uigradients.com 做渐变配色专用的网站,色值什么的非常全。 3.Adobe Color CC co…

2023年华数杯B题不透明制品最优配色方案设计(思路+代码+论文,已第三次更新)

已第三次更新,今天下午应该能把三道题都更新完毕.晚上开始写论文,专栏中有思路和代码. 4号18:00前订阅专栏,论文无需二次收费 目录 问题二+代码 问题三+代码 问题四+代码 问题1+代码 要求计算着色剂K/S与浓度的关系,然后通过拟合得到函数关系式和拟合系数。首先,我们需要…

IAR配色方案及配置方法

前言 从事嵌入式开发基本都要和 IAR 这款集成IDE打交道,其默认都是浅色主题,且自定义的一些关键字没有高亮的功能,今天给大家分享一个暗色系的配色方案,并且可以高亮自定义的关键字. 修改IAR配色方案的方法 设置编辑器的配色 T…

论文配色方案

方案1(复古): 系列色——十六进制颜色码: 0780cf - 765005 - fa6d1d - 0e2c82 - b6b51f - da1f18 - 701866 - f47a75 - 009db2 - 024b51 - 0780cf - 765005 系列色——RGB颜色值: (7,128,207&#xff09…