Go学习笔记(六) | 使用swaggo自动生成Restful API文档(转)
关于Swaggo
或许你使用过Swagger, 而 swaggo就是代替了你手动编写yaml的部分。只要通过一个命令就可以将注释转换成文档,这让我们可以更加专注于代码。
目前swaggo主要实现了swagger 2.0 的以下部分功能:
- 基本结构(Basic Structure)
- API 地址与基本路径(API Host and Base Path)
- 路径与操作 (Paths and Operations)
- 参数描述(Describing Parameters)
- 请求参数描述(Describing Request Body)
- 返回描述(Describing Responses)
- MIME 类型(MIME Types)
- 认证(Authentication)
- Basic Authentication
- API Keys
- 添加实例(Adding Examples)
- 文件上传(File Upload)
- 枚举(Enums)
- 按标签分组(Grouping Operations With Tags)
- 扩展(Swagger Extensions)
下文内容均以gin-swaggo为例
使用
安装swag cli 及下载相关包
要使用swaggo,首先需要安装swag cli。
go get -u github.com/swaggo/swag/cmd/swag
然后我们还需要两个包。
# gin-swagger 中间件 go get github.com/swaggo/gin-swagger # swagger 内置文件 go get github.com/swaggo/gin-swagger/swaggerFiles
在main.go内添加注释
package main
import (
"github.com/gin-gonic/gin"
ginSwagger "github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
)
// @title Swagger Example API
// @version 1.0
// @description This is a sample server celler server.
// @termsOfService https://razeen.me
// @contact.name Razeen
// @contact.url https://razeen.me
// @contact.email me@razeen.me
// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
// @host 127.0.0.1:8080
// @BasePath /api/v1
func main() {
r := gin.Default()
store := sessions.NewCookieStore([]byte("secret"))
r.Use(sessions.Sessions("mysession", store))
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
v1 := r.Group("/api/v1")
{
v1.GET("/hello", HandleHello)
v1.POST("/login", HandleLogin)
v1Auth := r.Use(HandleAuth)
{
v1Auth.POST("/upload", HandleUpload)
v1Auth.GET("/list", HandleList)
}
}
r.Run(":8080")
}
如上所示,我们需要导入
ginSwagger "github.com/swaggo/gin-swagger""github.com/swaggo/gin-swagger/swaggerFiles"
同时,添加注释。其中:
titile: 文档标题version: 版本description,termsOfService,contact ...这些都是一些声明,可不写。license.name额,这个是必须的。host,BasePath: 如果你想直接swagger调试API,这两项需要填写正确。前者为服务文档的端口,ip。后者为基础路径,像我这里就是“/api/v1”。- 在原文档中还有
securityDefinitions.basic,securityDefinitions.apikey等,这些都是用来做认证的,我这里暂不展开。
到这里,我们在mian.go同目录下执行swag init就可以自动生成文档,如下:
➜ swaggo-gin git:(master) ✗ swag init 2019/12/7 21:29:14 Generate swagger docs.... 2019/12/7 21:29:14 Generate general API Info 2019/12/7 21:29:14 create docs.go at docs/docs.go
然后我们导入这个自动生成的docs包,运行:
package main import ( "github.com/gin-gonic/gin" ginSwagger "github.com/swaggo/gin-swagger" "github.com/swaggo/gin-swagger/swaggerFiles" _ "github.com/razeencheng/demo-go/swaggo-gin/docs" ) // @title Swagger Example API // @version 1.0 // ...
➜ swaggo-gin git:(master) ✗ go build ➜ swaggo-gin git:(master) ✗ ./swaggo-gin [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET /api/v1/hello --> main.HandleHello (3 handlers) [GIN-debug] POST /api/v1/login --> main.HandleLogin (3 handlers) [GIN-debug] POST /upload --> main.HandleUpload (4 handlers) [GIN-debug] GET /list --> main.HandleList (4 handlers) [GIN-debug] GET /swagger/*any --> github.com/swaggo/gin-swagger.WrapHandler.func1 (4 handlers) [GIN-debug] Listening and serving HTTP on :8080
浏览器打开http://127.0.0.1:8080/swagger/index.html, 我们可以看到如下文档标题已经生成。

在Handle函数上添加注释
接下来,我们需要在每个路由处理函数上加上注释,如:
// @Summary 测试SayHello
// @Description 向你说Hello
// @Tags 测试
// @Accept mpfd
// @Produce json
// @Param who query string true "人名"
// @Success 200 {string} json "{"msg": "hello Razeen"}"
// @Failure 400 {string} json "{"msg": "who are you"}"
// @Router /hello [get]
func HandleHello(c *gin.Context) {
who := c.Query("who")
if who == "" {
c.JSON(http.StatusBadRequest, gin.H{"msg": "who are u?"})
return
}
c.JSON(http.StatusOK, gin.H{"msg": "hello " + who})
}
我们再次swag init, 运行一下。

此时,该API的相关描述已经生成了,我们点击Try it out还可以直接测试该API。

是不是很好用,当然这并没有结束,这些注释字段,我们一个个解释。

这些注释对应出现在API文档的位置,我在上图中已经标出,这里我们主要详细说说下面参数:
Tags
Tags 是用来给API分组的。
Accept
接收的参数类型,支持表单(mpfd) 和 JSON(json)
Produce
返回的数据结构,一般都是json, 其他支持如下表:
| Mime Type | 声明 |
|---|---|
| application/json | json |
| text/xml | xml |
| text/plain | plain |
| html | html |
| multipart/form-data | mpfd |
| application/x-www-form-urlencoded | x-www-form-urlencoded |
| application/vnd.api+json | json-api |
| application/x-json-stream | json-stream |
| application/octet-stream | octet-stream |
| image/png | png |
| image/jpeg | jpeg |
| image/gif | gif |
Param
参数,从前往后分别是:
@Param
1.参数名2.参数类型3.参数数据类型4.是否必须5.参数描述6.其他属性
1.参数名
参数名就是我们解释参数的名字。
2.参数类型
参数类型主要有四种:
body当Accept是JSON格式时,我们使用该字段指定接收的JSON类型// @Param param body main.JSONParams true "需要上传的JSON"
3.参数数据类型
数据类型主要支持一下几种:
- string (string)
- integer (int, uint, uint32, uint64)
- number (float32)
- boolean (bool)
注意,如果你是上传文件可以使用
file, 但参数类型一定是formData, 如下:// @Param file formData file true "文件"
4.是否是必须
表明该参数是否是必须需要的,必须的在文档中会黑体标出,测试时必须填写。
5.参数描述
就是参数的一些说明
6.其他属性
除了上面这些属性外,我们还可以为该参数填写一些额外的属性,如枚举,默认值,值范围等。如下:
枚举 // @Param enumstring query string false "string enums" Enums(A, B, C) // @Param enumint query int false "int enums" Enums(1, 2, 3) // @Param enumnumber query number false "int enums" Enums(1.1, 1.2, 1.3) 值添加范围 // @Param string query string false "string valid" minlength(5) maxlength(10) // @Param int query int false "int valid" mininum(1) maxinum(10) 设置默认值 // @Param default query string false "string default" default(A)
- 而且这些参数是可以组合使用的,如:
// @Param enumstring query string false "string enums" Enums(A, B, C) default(A)
Success
指定成功响应的数据。格式为:
// @Success
1.HTTP响应码{2.响应参数类型}3.响应数据类型4.其他描述
1.HTTP响应码
也就是200,400,500那些。
2.响应参数类型 / 3.响应数据类型
返回的数据类型,可以是自定义类型,可以是json。
- 自定义类型
在平常的使用中,我都会返回一些指定的模型序列化JSON的数据,这时,就可以这么写:
// @Success 200 {object} main.File
其中,模型直接用
包名.模型即可。你会说,假如我返回模型数组怎么办?这时你可以这么写:// @Success 200 {anrry} main.File
- json
将如你只是返回其他的json数据可如下写:
// @Success 200 {string} json ""
4.其他描述
可以添加一些说明。
Failure
同Success。
Router
指定路由与HTTP方法。格式为:
// @Router
/path/to/handle[HTTP方法]
不用加基础路径哦。
生成文档与测试
其实上面已经穿插的介绍了。
在main.go下运行swag init即可生成和更新文档。
点击文档中的Try it out即可测试。 如果部分API需要登陆,可以Try登陆接口即可。
优化
看到这里,基本可以使用了。但文档一般只是我们测试的时候需要,当我的产品上线后,接口文档是不应该给用户的,而且带有接口文档的包也会大很多(swaggo是直接build到二进制里的)。
想要处理这种情况,我们可以在编译的时候优化一下,如利用build tag来控制是否编译文档。
在main.go声明swagHandler,并在该参数不为空时才加入路由:
package main
//...
var swagHandler gin.HandlerFunc
func main(){
// ...
if swagHandler != nil {
r.GET("/swagger/*any", swagHandler)
}
//...
}
同时,我们将该参数在另外加了build tag的包中初始化。
// +build doc
package main
import (
_ "github.com/razeencheng/demo-go/swaggo-gin/docs"
ginSwagger "github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
)
func init() {
swagHandler = ginSwagger.WrapHandler(swaggerFiles.Handler)
}
之后我们就可以使用go build -tags "doc"来打包带文档的包,直接go build来打包不带文档的包。
你会发现,即使我这么小的Demo,编译后的大小也要相差19M !
➜ swaggo-gin git:(master) ✗ go build ➜ swaggo-gin git:(master) ✗ ll swaggo-gin -rwxr-xr-x 1 xxx staff 15M Jan 13 00:23 swaggo-gin ➜ swaggo-gin git:(master) ✗ go build -tags "doc" ➜ swaggo-gin git:(master) ✗ ll swaggo-gin -rwxr-xr-x 1 xxx staff 34M Jan 13 00:24 swaggo-gin
Go学习笔记(六) | 使用swaggo自动生成Restful API文档(转)的更多相关文章
- Golang使用swaggo自动生成Restful API文档
#关于Swaggo 相信很多程序猿和我一样不喜欢写API文档.写代码多舒服,写文档不仅要花费大量的时间,有时候还不能做到面面具全.但API文档是必不可少的,相信其重要性就不用我说了,一份含糊的文档甚至 ...
- Spring Boot学习笔记 - 整合Swagger2自动生成RESTful API文档
1.添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!--swagger2--> <dependency> <groupId>io.spr ...
- 使用jsdoc-toolkit来自动生成js api文档
近来前端组小盆友开发的类库越来越多,很多情况下彼此不知道写了些什么方法,为了更好的合作提高工作效率,找了个比较好的api文档生成方法.使用jsdoc-toolkit来自动生成js api文档. 一. ...
- Spring Boot 集成 Swagger 生成 RESTful API 文档
原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...
- Spring Boot 集成Swagger2生成RESTful API文档
Swagger2可以在写代码的同时生成对应的RESTful API文档,方便开发人员参考,另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API. 使用Spring Boot可 ...
- 第十二节:WebApi自动生成在线Api文档的两种方式
一. WebApi自带生成api文档 1. 说明 通过观察,发现WebApi项目中Area文件夹下有一个HelpPage文件夹,如下图,该文件夹就是WebApi自带的生成Api的方式,如果该文件夹没了 ...
- 如何生成RestFul Api文档
Web API文档工具列表Swagger ——Swagger框架可以通过代码生成漂亮的在线API,甚至可以提供运行示例.支持Scala.Java.Javascript.Ruby.PHP甚至 Actio ...
- Api2Doc生成 Restful API 文档
1,引入maven <dependency> <groupId>com.github.terran4j</groupId> <artifactId>te ...
- C# 自动生成代码API文档
暂时没学会正规的转载style临时记录一下 NET中的规范标准注释(一) -- XML注释标签讲解 http://www.cnblogs.com/mq0036/p/3544264.html NET中的 ...
随机推荐
- Spring mybatis源码篇章-Mybatis主文件加载
通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-SqlSessionFactory 前话 本文承接前文的内容继续往下扩展,通过Spring与Mybatis的 ...
- docker-compose搭建elasticsearch+kibana环境,以及php使用elasticsearch
一.elasticsearch的Dockerfile 增加中文搜索插件analysis-ik FROM docker.elastic.co/elasticsearch/elasticsearch:7. ...
- 11.vim常用操作
:set nu在命令模式下显示行号 进入输入模式 新增 (append) a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动. A:从光标所在列最後面的地方开始新增资料. 插入 ...
- 数据库设计规范、E-R图、模型图
(1)数据库设计的优劣: 糟糕的数据库设计: ①数据冗余冗余.存储空间浪费. ②数据更新和插入异常. ③程序性能差. 良好的数据库设计 ①节省数据的存储空间. ②能够保证数据的完整新. ③方便进行数据 ...
- R-corrplot相关性绘图,只有你想不到的
初步接触数据集,探索性分析后,经常需要做一个相关分析,得到各变量间的相关系数以及显著性水平. 本文介绍一下R-corrplot包进行相关可视化展示. 一 数据准备 载入所需的R包,利用公共数据集mtc ...
- win10下面opencv安装
记得以前是安装好的,但是用了conda更新所有包以后,cv2不好用了,试验了很多方法都不管用,最后只能卸载opencv然后重新安装了. 如果电脑上安装了很多版本的python,比如我就安装了pytho ...
- std::string与char*之临时缓冲区
std::string与char*之临时缓冲区 原文:https://blog.csdn.net/hsshh1988/article/details/80689330 c++文件读取流程如下: ifs ...
- SpringBoot与缓存、消息、检索、任务、安全与监控
一.Spring抽象缓存 Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口 ...
- JS闭包的简单理解。优缺点以及垃圾回收机制
闭包是什么? ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...
- ZPL语言完成条形码的打印
近期因为项目的需求,需要使用到打印机来打印业务相关的条形码和其他信息,由于之前有操作其它打印机的经验,Leader就安排我来做这个了(凑哦,这能说我是懵逼的么).于是就开始了我的探索之旅啦,不对,是踩 ...