Golang使用swaggo自动生成Restful API文档

相信很多程序猿和我一样不喜欢写API文档。写代码多舒服,写文档不仅要花费大量的时间,有时候还不能做到面面具全。但API文档是必不可少的,相信其重要性就不用我说了,一份含糊的文档甚至能让前后端人员打起来。 而今天这篇博客介绍的swaggo就是让你只需要专注于代码就可以生成完美API文档的工具。废话说的有点多,我们直接看文章。

目前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为例

要使用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

可以看一下自己安装的版本

    swag --version
    swag version v1.6.5
    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/01/12 21:29:14 Generate swagger docs....

    2019/01/12 21:29:14 Generate general API Info
    2019/01/12 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

接下来,我们需要在每个路由处理函数上加上注释,如:

    // @Summary 测试SayHello
    // @Description 向你说Hello
    // @Tags 测试
    // @Accept mpfd
    // @Produce json
    // @Param who query string true "人名"
    // @Success 200 {string} string "{"msg": "hello Razeen"}"
    // @Failure 400 {string} string "{"msg": "who are you"}"
    // @Router /hello [get]
    funcHandleHello(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 是用来给API分组的。

接收的参数类型,支持表单(mpfd) , JSON(json)等,更多如下表。

返回的数据结构,一般都是 json

参数,从前往后分别是:

@Param who query string true “人名”
@Param 1.参数名2.参数类型3.参数数据类型4.是否必须5.参数描述6.其他属性

1.参数名

参数名就是我们解释参数的名字。

2.参数类型

参数类型主要有四种:

    // @Param id path integer true "文件ID"

    // @Param who query string true "人名"
    // @Param user formData string true "用户名" default(admin)

bodyAcceptJSON格式时,我们使用该字段指定接收的JSON类型

    // @Param param body main.JSONParams true "需要上传的JSON"

3.参数数据类型

数据类型主要支持一下几种:

注意,如果你是上传文件可以使用 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 1.HTTP响应码{2.响应参数类型}3.响应数据类型4.其他描述

1.HTTP响应码

也就是200,400,500那些。

2.响应参数类型 / 3.响应数据类型

返回的数据类型,可以是自定义类型,可以是json。

  • 自定义类型

在平常的使用中,我都会返回一些指定的模型序列化JSON的数据,这时,就可以这么

    // @Success 200 {object} main.File

其中,模型直接用 包名.模型即可。你会说,假如我返回模型数组怎么办?这时你可以这么写:

    // @Success 200 {anrry} main.File

将如你只是返回其他的数据格式可如下写:

    // @Success 200 {string} string ""

4.其他描述

可以添加一些说明。

​ 同Success。

​ 指定路由与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

    funcmain(){
    // ...

    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"
    )

    funcinit() {
        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

本文章摘自https://razeencheng.com/post/go-swagger.html

Original: https://www.cnblogs.com/cxykhaos/p/15345317.html
Author: 程序员khaos
Title: Golang使用swaggo自动生成Restful API文档

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516580/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Go 中的 byte、rune 与 string

    byte 和 rune byte 是 uint8 的别名,其字面量是 8 位整数值,byte 切片相比于不可变的 string 方便常用许多。它可以更改每个字节或字符。这对于处理文…

    Go语言 2023年5月25日
    074
  • Go – 如何编写 ProtoBuf 插件(二)?

    上篇文章《Go – 如何编写 ProtoBuf 插件 (一) 》,分享了使用 proto3 的 自定义…

    Go语言 2023年5月25日
    050
  • [grpc快速入门] 一 grpc生成与调用

    下载通用编译器 地址:https://github.com/protocolbuffers/protobuf/releases选择对应的版本,解压后将文件夹下bin目录配置到环境变…

    Go语言 2023年5月25日
    070
  • 在开发中将git运用自如

    写这篇文章的初衷是记录自己在开发中使用git遇到的问题和如何利用git进行高效的开发。个人理解来看,很多人对git运用不自如主要是两方面的原因:1、死记硬背命令,这个其实可以通过h…

    Go语言 2023年5月25日
    042
  • 【Go语言】(一)环境搭建与了解VScode工具

    视频链接(p1~p8): golang入门到项目实战 [2022最新Go语言教程,没有废话,纯干货!] 参考链接: 用vscode开发go的时候,安装go包报错:connectex…

    Go语言 2023年5月25日
    056
  • go-micro集成RabbitMQ实战和原理

    在go-micro中异步消息的收发是通过Broker这个组件来完成的,底层实现有RabbitMQ、Kafka、Redis等等很多种方式,这篇文章主要介绍go-micro使用Rabb…

    Go语言 2023年5月25日
    055
  • Go语言内置函数大全

    https://studygolang.com/articles/1708 Original: https://www.cnblogs.com/answercard/p/12574…

    Go语言 2023年5月29日
    049
  • 使用Go http重试请求

    原文连接:https://www.zhoubotong.site/post/78.html开发中对于http请求是经常遇到,一般可能网络延迟或接口返回超时,对于发起客户端的请求, …

    Go语言 2023年5月25日
    046
  • Go – 使用 sync.WaitGroup 来实现并发操作

    如果你有一个任务可以分解成多个子任务进行处理,同时每个子任务没有先后执行顺序的限制,等到全部子任务执行完毕后,再进行下一步处理。这时每个子任务的执行可以并发处理,这种情景下适合使用…

    Go语言 2023年5月25日
    056
  • go语言并发编程

    引言 说到go语言最厉害的是什么就不得不提到并发,并发是什么?,与并发相关的并行又是什么?并发:同一时间段内执行多个任务并行:同一时刻执行多个任务 进程、线程与协程 进程: 进程是…

    Go语言 2023年5月25日
    055
  • Go语言基础之并发

    并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。 Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微…

    Go语言 2023年5月29日
    044
  • AES加解密(golang <--> crypto-js)

    AES(Advanced Encryption Standard) 是一种对称加密算法,是比 DES 更好的对称加密算法类。 使用AES,在前后端之间传送密码等相关数据时,能简单高…

    Go语言 2023年5月25日
    043
  • 基于LSM的Key-Value数据库实现稀疏索引篇

    上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢…

    Go语言 2023年5月25日
    067
  • 使用go语言遇到的一些问题记录

    一、参数校验问题 使用go做web服务时,经常需要对请求参数进行校验,有些必填参数需要校验是否为空。 经常会遇到参数a为int类型,但是其值取值范围为0-xxx。0也是有意义的。 …

    Go语言 2023年5月29日
    054
  • Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式

    上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链…

    Go语言 2023年5月25日
    054
  • 系统调用跟踪——分析(一)

    通过strace工具可跟踪用户进程与Linux内核的调用交互,可看到其中的System Call(系统调用)情况; &#x5B89;&#x88C5;strace&a…

    Go语言 2023年5月25日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球