集成Swagger到Gin项目

admin
admin 2022年01月17日
  • 在其它设备中阅读本文章

简介

Swagger 本质上是一种用于描述使用 JSON 表示的RESTful API的接口描述语言。Swagger 与一组开源软件工具一起使用,以设计、构建、记录和使用RESTful Web服务。Swagger 包括自动文档,代码生成和测试用例生成。
在前后端分离的项目开发过程中,如果后端能够提供一份清晰明了的接口文档,那么就能极大地提高大家的沟通效率和开发效率。可是编写接口文档历来都是令人头痛的,而且后续接口文档的维护也十分耗费精力。
最好是有一种方案能够既满足我们输出文档的需要又能随代码的变更自动更新,而 Swagger 正是那种能帮我们解决接口文档问题的工具。

集成

想要使用 gin-swagger 为代码自动生成接口文档,一般需要下面三个步骤:

  1. 按照 swagger 要求给接口代码添加声明式注释,具体参照声明式注释格式。
  2. 使用 swag 工具扫描代码自动生成 API 接口文档数据
  3. 使用 gin-swagger 渲染在线接口文档页面

第一步:添加注释

在程序入口 main 函数上以注释的方式写下项目相关介绍信息。

package main

// @title 这里写标题
// @version 1.0
// @description 这里写描述信息
func main() {
 r := gin.New()

 r.Run()
}

在你代码中处理请求的接口函数(通常位于 controller 层)按如下方式写上注释:

// GetPostListHandler2 升级版帖子列表接口
// @Summary 升级版帖子列表接口
// @Description 可按社区按时间或分数排序查询帖子列表接口
// @Tags 帖子相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param object query models.ParamPostList false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} _ResponsePostList
// @Router /posts2 [get]
func GetPostListHandler2(c *gin.Context) {
 p := &models.ParamPostList{
  Page:  1,
  Size:  10,
  Order: models.OrderTime,
 }
 ...
}

上面注释中参数类型使用了 object,models.ParamPostList 具体定义如下:

// bluebell/models/params.go

// ParamPostList 获取帖子列表query string参数
type ParamPostList struct {
 CommunityID int64  `json:"community_id" form:"community_id"`   // 可以为空
 Page        int64  `json:"page" form:"page" example:"1"`       // 页码
 Size        int64  `json:"size" form:"size" example:"10"`      // 每页数据量
 Order       string `json:"order" form:"order" example:"score"` // 排序依据
}

响应数据类型也使用的 object,在 controller 层专门定义一个 docs_models.go 文件来存储文档中使用的响应数据 model。

// bluebell/controller/docs_models.go

// _ResponsePostList 帖子列表接口响应数据
type _ResponsePostList struct {
 Code    ResCode                 `json:"code"`    // 业务响应状态码
 Message string                  `json:"message"` // 提示信息
 Data    []*models.ApiPostDetail `json:"data"`    // 数据
}

第二步:生成接口文档数据

编写完注释后,使用以下命令安装 swag 工具:

go get -u github.com/swaggo/swag/cmd/swag

# 1.16 及以上版本
go install github.com/swaggo/swag/cmd/swag@latest

在项目根目录执行以下命令,使用 swag 工具生成接口文档数据。

swag init

执行完上述命令后,如果你写的注释格式没问题,此时你的项目根目录下会多出一个 docs 文件夹。

./docs
├── docs.go
├── swagger.json
└── swagger.yaml

第三步:引入 gin-swagger 渲染文档数据

然后在项目代码中注册路由的地方按如下方式引入 gin-swagger 相关内容:

import (
    "github.com/gin-gonic/gin"
    "github.com/swaggo/gin-swagger"
    "github.com/swaggo/gin-swagger/swaggerFiles"

    _ "bluebell/docs"
)

注册 swagger api 相关路由

func main() {
    r := gin.Default()

    ...

    r.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
    r.Run(":8080")
}

把程序运行起来,打开浏览器访问 http://localhost:8080/docs/index.html 就能看到 Swagger 2.0 Api 文档了。

通用 API 信息

示例

注释 说明 示例
title 必填 应用程序的名称。// @title Swagger Example API
version 必填 提供应用程序 API 的版本。// @version 1.0
description 应用程序的简短描述。// @description This is a sample server celler server.
tag.name标签的名称。// @tag.name This is the name of the tag
tag.description标签的描述。// @tag.description Cool Description
tag.docs.url标签的外部文档的 URL。// @tag.docs.url https://example.com
tag.docs.description标签的外部文档说明。// @tag.docs.description Best example documentation
termsOfServiceAPI 的服务条款。// @termsOfService http://swagger.io/terms/
contact.name公开的 API 的联系信息。// @contact.name API Support
contact.url联系信息的 URL。 必须采用网址格式。// @contact.url http://www.swagger.io/support
contact.email联系人 / 组织的电子邮件地址。 必须采用电子邮件地址的格式。// @contact.email support@swagger.io
license.name必填 用于 API 的许可证名称。// @license.name Apache 2.0
license.url 用于 API 的许可证的 URL。 必须采用网址格式。// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
host运行 API 的主机(主机名或 IP 地址)。// @host localhost:8080
BasePath运行 API 的基本路径。// @BasePath /api/v1
acceptAPI 可以使用的 MIME 类型列表。 请注意,Accept 仅影响具有请求正文的操作,例如 POST、PUT 和 PATCH。 值必须如“Mime 类型 ”中所述。// @accept json
produceAPI 可以生成的 MIME 类型的列表。值必须如“Mime 类型”中所述。// @produce json
query.collection.format 请求 URI query 里数组参数的默认格式:csv,multi,pipes,tsv,ssv。 如果未设置,则默认为 csv。// @query.collection.format multi
schemes用空格分隔的请求的传输协议。// @schemes http https
x-name扩展的键必须以 x - 开头,并且只能使用 json 值 // @x-example-key {"key": "value"}

API 操作

示例

注释 描述
description 操作行为的详细说明。
description.markdown应用程序的简短描述。该描述将从名为endpointname.md的文件中读取。
id用于标识操作的唯一字符串。在所有 API 操作中必须唯一。
tags每个 API 操作的标签列表,以逗号分隔。
summary该操作的简短摘要。
acceptAPI 可以使用的 MIME 类型列表。 请注意,Accept 仅影响具有请求正文的操作,例如 POST、PUT 和 PATCH。 值必须如“Mime 类型 ”中所述。
produceAPI 可以生成的 MIME 类型的列表。值必须如“Mime 类型”中所述。
param 用空格分隔的参数。param name,param type,data type,is mandatory?,comment attribute(optional)
security每个 API 操作的 安全性
success 以空格分隔的成功响应。return code,{param type},data type,comment
failure 以空格分隔的故障响应。return code,{param type},data type,comment
response与 success、failure 作用相同
header 以空格分隔的头字段。 return code,{param type},data type,comment
router 以空格分隔的路径定义。 path,[httpMethod]
x-name 扩展字段必须以x-开头,并且只能使用 json 值。