再过5分钟你就能了解如何使用 Gin + Swagger 啦

3,305 阅读2分钟

1. 安装 swag

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

2. 生成文件

首次生成相关文件,后期代码修改过,添加swag注解后,都需要在go 项目中(包含main.go)的目录,使用swag init命令生成相关文件,执行完上述命令后,如果写的注释格式没问题,项目根目录下会多出一个docs文件夹。

swag init

如果输入命令出现“不是内部或外部命令”、“swag init command not found”,cd到这个路径

cd C:\Users\username\go\pkg\mod\github.com\swaggo\swag@v1.8.7\cmd\swag

然后执行

go install

再cd到路径

cd C:\Users\username\go\bin

这个文件夹下面有swag.exe 将这个路径添加到环境变量,重开cmd窗口即可

3. 安装 gin-swagger

go get -u github.com/swaggo/gin-swagger

4. 集成

4.1 基础信息

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

package router

import (
	_ "nmc_website/docs"
	"nmc_website/service"

	"github.com/gin-gonic/gin"
	swaggerfiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

func Router() *gin.Engine {
	gin.SetMode(gin.ReleaseMode)
	r := gin.Default()
	r.LoadHTMLGlob("template/*")
	// 注册Swagger api相关路由
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
	r.GET("/ping", service.Ping)
	return r
}

// @title 标题
// @version 1.0 版本
// @description 描述
// @termsOfService http://swagger.io/terms/
// @contact.name 联系人
// @contact.url http://www.swagger.io/support
// @contact.email 584807419@qq.com
// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
// @host videotools.cn
// @BasePath /freeapi/v1
// @query.collection.format multi
func main() {
	r := Router()
	r.Run("0.0.0.0:80")
}

项目程序运行起来,打开浏览器访问http://localhost:80/swagger/index.html

gin-swagger 提供了 DisablingWrapHandler 函数,方便通过设置环境变量禁用Swagger。

r.GET("/swagger/*any", gs.DisablingWrapHandler(swaggerFiles.Handler, "NAME_OF_ENV_VARIABLE"))

如果将环境变量 NAME_OF_ENV_VARIABLE设置为任意值,则 /swagger/*any 返回404响应,就像未指定路由一样。

4.2 简单示例

4.2.1 GET

// GetList
// @Summary 摘要
// @Schemes
// @Description 描述
// @Tags 标签
// @Param Id query int true "参数描述" 分别表示 :@Param 参数名 位置(query或path或body) 类型 是否必需 注释
// @Param object query models.ParamList false "查询参数"
// @Accept json
// @Produce json
// @Success 200 {object} Model._ResponseList 返回结果 200 类型(object就是结构体) 类型 注释
// @Router /user [get]
 func GetList(g *gin.Context)  {
  g.JSON(http.StatusOK, nil) 
}

//注释中参数类型使用了 `object`,`models.ParamList` 具体定义如下:
// ParamList 获取列表query string参数
type ParamList struct {
	ID int64  `json:"id" form:"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"` // 排序依据
}

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

其他
// @Security ApiKeyAuth
// @Param Authorization header string false "Bearer 用户令牌"
// @Accept application/json
// @Produce application/json
// @Success 200 {string} json "{"code":"200", "data":"response data"}"

4.2.2 PUT

// @Summary 修改
// @Schemes
// @Description update
// @Tags ops
// @Param userinput body Model.UserUpdateInput true "入参"
// @Accept json
// @Produce json
// @Success 200 {object} Model.ResponseResult UpdateUser
// @Router /user [put]
func UpdateData(g *gin.Context) {
}