一起来看看如何在Go中使用Swagger?


Swagger go 的使用

http 服务

安装


go get -u github.com/swaggo/swag/cmd/swag@v1.7.8
go get -u github.com/swaggo/gin-swagger@v1.3.3
go get -u github.com/swaggo/files
go get -u github.com/alecthomas/template

验证是否安装成功


swag -v

# swag version v1.7.8

写入注解

注解描述
@Summary摘要
@ProduceAPI 可以产生的 MIME 类型的列表,MIME 类型你可以简单的理解为响应类型,例如:json、xml、html 等等
@Param参数格式,从左到右分别为:参数名、入参类型、数据类型、是否必填、注释
@Success响应成功,从左到右分别为:状态码、参数类型、数据类型、注释
@Failure响应失败,从左到右分别为:状态码、参数类型、数据类型、注释
@Router路由,从左到右分别为:路由地址,HTTP 方法

// @Summary 新增标签
// @Produce  json
// @Param name body string true "标签名称" minlength(3) maxlength(100)
// @Param state body int false "状态" Enums(0, 1) default(1)
// @Param created_by body string false "创建者" minlength(3) maxlength(100)
// @Success 200 {object} model.Tag "成功"
// @Failure 400 {object} errcode.Error "请求错误"
// @Failure 500 {object} errcode.Error "内部错误"
// @Router /api/v1/tags [post]
func (t Tag) Create(c *gin.Context) {}

针对项目写注解


// @title gin-blog-service 博客系统
// @version 1.0
// @description gin-blog-service 学习 gin 写的一个博客系统
// @termsOfService https://github.com/pudongping/gin-blog-service
func main() {
    
}

生成文档


swag init

添加 swagger 访问路由

这里以 gin 框架中使用为例


import (

    "github.com/gin-gonic/gin"
	ginSwagger "github.com/swaggo/gin-swagger"
	"github.com/swaggo/gin-swagger/swaggerFiles"

    // 初始化 docs 包,内含有 swagger 生成的文档
	_ "github.com/pudongping/gin-blog-service/docs"
)


func NewRouter() *gin.Engine {

	r := gin.New()

    // 如果有额外需求,可以手动指定访问地址
	// swaggerUrl := ginSwagger.URL("http://127.0.0.1:8000/swagger/doc.json")
	// r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, swaggerUrl))
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

    return r
}

grpc 服务

安装 protoc 插件 protoc-gen-swagger

protoc-gen-swagger 的作用是通过 proto 文件来生成 swagger 定义(.swagger.json)

go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger

下载 Swagger UI 文件

Swagger 提供可视化的接口管理平台,也就是 Swagger UI,我们首先需要到 https://github.com/swagger-api/swagger-ui 上将其源码压缩包下载下来,接着在项目的 third_party 目录下新建 swagger-ui 目录,将其 dist 目录下的所有资源文件拷贝到我们项目的 third_party/swagger-ui 目录中去。

静态资源转换

# 将静态文件转换为 go 代码
go get -u github.com/go-bindata/go-bindata/...

在项目的 pkg 目录下新建 swagger 目录,并在项目根目录下执行以下转换命令

# 在执行完毕后,应当在项目的 pkg/swagger 目录下创建了 data.go 文件
go-bindata --nocompress -pkg swagger -o pkg/swagger/data.go third_party/swagger-ui/...

Swagger UI 处理和访问

为了让刚刚转换的静态资源代码能够让外部访问到,我们需要安装 go-bindata-assetfs 库,它能够结合 net/http 标准库和 go-bindata 所生成 Swagger UI 的 Go 代码两者来供外部访问

go get -u github.com/elazarl/go-bindata-assetfs/...

引入并使用


import (
	assetfs "github.com/elazarl/go-bindata-assetfs"
	"github.com/pudongping/go-grpc-service/pkg/swagger"
)

func runHttpServer() *http.ServeMux {
	httpMux := http.NewServeMux()
	httpMux.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
		_, _ = w.Write([]byte(`pong`))
	})

    // 代码大致调整这里 start
	prefix := "/swagger-ui/"
	fileServer := http.FileServer(&assetfs.AssetFS{
		Asset:    swagger.Asset,
		AssetDir: swagger.AssetDir,
		Prefix:   "third_party/swagger-ui",
	})
	httpMux.Handle(prefix, http.StripPrefix(prefix, fileServer))
	
	httpMux.HandleFunc("/swagger/", func(w http.ResponseWriter, r *http.Request) {
		if !strings.HasSuffix(r.URL.Path, "swagger.json") {
			http.NotFound(w, r)
			return
		}

		p := strings.TrimPrefix(r.URL.Path, "/swagger/")
		p = path.Join("proto", p)

		http.ServeFile(w, r, p)
	})	
    // 代码大致调整这里 end	

	return httpMux
}

重新运行服务,通过浏览器访问 http://127.0.0.1:8004/swagger-ui/ 即可访问 swagger 面板

访问自己的 swagger 文档接口 http://127.0.0.1:8004/swagger/tag.swagger.json


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
评论
  目录