golang swaggo 生成 swagger 文档

简介

swaggo 是一个开源项目,它能将 go 注释转换为 swagger 2.0 文档,且目前已经适配了多种流行框架,提供了插件允许与现有的 Go 项目快速集成。

安装

在你的项目根目录下执行:

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

命令会将 swaggo 的可执行程序安装到你的 GOPATH/bin 目录下。

初始化 / 更新文档

在项目中编写 go swaggo 注释后,在你的 main 文件所在目录下执行初始化命令:

swag init -g main.go -o docs
  • main.go 代表你的启动文件名称
  • -o docs 指定文档生成的目录

执行完毕后会在执行目录下 docs 目录下生成 docs.go,swagger.json,swagger.yml 文件,其中 docs.go 是swagger 首页 html 的加载文件以及通用信息的初始化,swagger.json 和 swagger.yml 是 api 的描述文件。

gin 使用 swaggo

gin 整合 swaggo 很简单,主要是在 gin 的路由添加少量配置就可以。

代码实例:

// @securityDefinitions.apikey ACCESS_TOKEN
// @in header
// @name access_token
// @Security ACCESS_TOKEN
func main() {

    // 如果 swaggo 注释在其他包下,需要 import 一下

    initDocsInfo()
    engine := gin.Default()

    engine.Use(cors.New(corsConfig()))

    // 注册 swagger api
    engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
    engine.GET("/swaggo/get/:id", GetFunc)
    engine.POST("/swaggo/post", PostFunc)

    engine.Run("127.0.0.1:8080")

}

// 修改生成的 swagger 通用信息
func initDocsInfo() {
    docs.SwaggerInfo.Version = "1.0.0"
    docs.SwaggerInfo.Host = "127.0.0.1:8080"
    docs.SwaggerInfo.BasePath = "/"
    docs.SwaggerInfo.Title = "Swaggo API"
    docs.SwaggerInfo.Schemes = []string{"http", "https"}
}

func corsConfig() cors.Config {
    corsConf := cors.Config{}
    corsConf.AllowAllOrigins = true
    return corsConf
}
  • main 函数上方的注释为 header 定义,指定 api 请求需要 access token。
  • ginSwagger.WrapHandler(swaggerFiles.Handler) 注册 gin swaggo 的资源。
  • initDocsInfo 函数用于初始化 docs.go 文件中 swagger 的通用信息。
  • 添加 cors 防止跨域。

api 定义示例:

type ViewVO struct {
    // 字符串
    String string `json:"string"`
    // 布尔
    Bool bool `json:"bool"`
    // 数字
    Number int `json:"number"`
}

// @Tags api
// @Router /swaggo/get/{id} [get]
// @Summary get
// @Description get
// @Security ACCESS_TOKEN
// @Accept  json
// @Produce  json
// @Param id path string false "id"
// @Param string query string false "字符串"
// @Param bool query bool false "布尔"
// @Param number query int false "数字"
// @success 200 {object} ViewVO
func GetFunc(ctx *gin.Context) {
    ctx.JSON(200, "GetFunc")
}

// @Tags api
// @Router /swaggo/post [post]
// @Summary post
// @Description post
// @Security ACCESS_TOKEN
// @Accept  json
// @Produce  json
// @Param params body ViewVO true "params"
// @success 200 {array} ViewVO
func PostFunc(ctx *gin.Context) {
    ctx.JSON(200, "PostFunc")
}

启动服务后访问 http://localhost:8080/swagger/index.html,生成的 swagger 页面如下:

在这里插入图片描述
在这里插入图片描述

beego 使用 swaggo

由于 beego 框架本身自带的 beego docs 我觉得不是很好用,所以使用 swaggo 也是个不错的选择。

虽然 swaggo 官方不支持 beego,但是实现也比较简单,我们只需要先下载 swagger 的静态资源再读取就可以了。

  1. 在项目根目录下创建 docs 目录,下载静态资源文件:

在这里插入图片描述

  1. 将其中的 index.html 读取 swagger json 的请求接口修改一下,之后我们在 beego 中添加这个接口即可:
<script>
  window.onload = function() {
    // Begin Swagger UI call region
    const ui = SwaggerUIBundle({
      // 修改为我们自己的接口
      url: "/swagger/json",
      // 以下忽略
  };
</script>
  1. 使用命令在 docs 目录下生成 docs.go 与 swagger.json 文件:
swag init -g main.go -o docs

代码示例:

// @securityDefinitions.apikey ACCESS_TOKEN
// @in header
// @name access_token
// @Security ACCESS_TOKEN
func main() {
    // 放行静态资源
    beego.BConfig.WebConfig.DirectoryIndex = true
    beego.BConfig.WebConfig.StaticDir["/swagger"] = "docs"

    // cors
    beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
       AllowAllOrigins: true,
    }))

    // 获取 swagger.json 的接口
    beego.Get("/swagger/json", docs.SwaggerJson)

    beego.Get("/swaggo/get/:id", GetFunc)
    beego.Post("/swaggo/post/", PostFunc)

    docs.Init("1.0.0", "127.0.0.1:8080", "/", "Swaggo API")

    beego.Run("127.0.0.1:8080")
}

// package docs

// Init 修改生成的 swagger 通用信息
func Init(version, host, basePath, title string) {
    SwaggerInfo.Version = version
    SwaggerInfo.Host = host
    SwaggerInfo.BasePath = basePath
    SwaggerInfo.Title = title
    SwaggerInfo.Schemes = []string{"http", "https"}
}

func SwaggerJson(ctx *context.Context) {
    json, _ := swag.ReadDoc(SwaggerInfo.InfoInstanceName)
    ctx.WriteString(json)
}

api 定义示例

type ViewVO struct {
    // 字符串
    String string `json:"string"`
    // 布尔
    Bool bool `json:"bool"`
    // 数字
    Number int `json:"number"`
}

// @Tags api
// @Router /swaggo/get/{id} [get]
// @Summary get
// @Description get
// @Security ACCESS_TOKEN
// @Accept  json
// @Produce  json
// @Param id path string false "id"
// @Param string query string false "字符串"
// @Param bool query bool false "布尔"
// @Param number query int false "数字"
// @success 200 {object} ViewVO
func GetFunc(ctx *context.Context) {
    ctx.WriteString("GetFunc")
}

// @Tags api
// @Router /swaggo/post [post]
// @Summary post
// @Description post
// @Security ACCESS_TOKEN
// @Accept  json
// @Produce  json
// @Param params body ViewVO true "params"
// @success 200 {array} ViewVO
func PostFunc(ctx *context.Context) {
    ctx.WriteString("PostFunc")
}

启动服务后访问 http://localhost:8080/swagger/index.html 即可看到生成的 swagger 页面。

最后

swaggo 的详细用法可参考官方文档:swaggo

文中示例代码已经上传仓库:igolang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值