go服务配置swagger文档

515 阅读1分钟

安装swagger

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

验证swag版本

swag   -v

写入注解

注解描述
@Summary摘要
@ProduceAPI 可以产生的 MIME 类型的列表,MIME 类型你可以简单的理解为响应类型,例如:json、xml、html 等等
@Param参数格式,从左到右分别为:参数名、入参类型、数据类型、是否必填、注释
@Success响应成功,从左到右分别为:状态码、参数类型、数据类型、注释
@Failure响应失败,从左到右分别为:状态码、参数类型、数据类型、注释
@Router路由,从左到右分别为:路由地址,HTTP 方法
// @Summary 获取多个标签
// @Produce  json
// @Param name query string false "标签名称" maxlength(100)
// @Param state query int false "状态" Enums(0, 1) default(1)
// @Param page query int false "页码"
// @Param page_size query int false "每页数量"
// @Param Authorization header string true "Bearer Token"
// @Success 200 {object} model.Tag "成功"
// @Failure 400 {object} errcode.Error "请求错误"
// @Failure 500 {object} errcode.Error "内部错误"
// @Router /api/v1/tags [get]
func (t Tag) List(c *gin.Context) {
	param := service.TagListRequest{}
	response := app.NewResponse(c)
	valid, errs := app.BindAndValid(c, &param)
	if !valid {
		global.Logger.Errorf(c, "app.BindAndValid errs: %v", errs)
		response.ToErrorResponse(errcode.InvalidParams.WithDetails(errs.Errors()...))
		return
	}

	svc := service.New(c.Request.Context())
	pager := app.Pager{Page: app.GetPage(c), PageSize: app.GetPageSize(c)}
	totalRows, err := svc.CountTag(&service.CountTagRequest{Name: param.Name, State: param.State})
	if err != nil {
		global.Logger.Errorf(c, "svc.CountTag err: %v", err)
		response.ToErrorResponse(errcode.ErrorCountTagFail)
		return
	}

	tags, err := svc.GetTagList(&param, &pager)
	if err != nil {
		global.Logger.Errorf(c, "svc.GetTagList err: %v", err)
		response.ToErrorResponse(errcode.ErrorGetTagListFail)
		return
	}

	response.ToResponseList(tags, totalRows)
	return
}

生成swagger

在完成接口注释后,回到项目根目录,执行:

swag  init

在执行完命令后,根目录docs文件夹下会生成docs.go,swagger.json,swagger.yaml三个文件.

路由配置

在routers中进行默认初始化和注册对应路由,在router.go中配置如下代码:

import (
    ...
    _ "github.com/go-programming-tour-book/blog-service/docs"
    swaggerfiles "github.com/swaggo/files"
    ginSwagger "github.com/swaggo/gin-swagger"
)

func NewRouter() *gin.Engine {
	r := gin.New()
	r.Use(gin.Logger())
	r.Use(gin.Recovery())

	// 设置 Swagger文档地址
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler,))
    ...
    return r
}

重启服务后,本地就可以看到swagger文档地址 http://127.0.0.1:8000/swagger/index.html