Categorygithub.com/CloverOS/goctl-swag
module
1.6.2
Repository: https://github.com/cloveros/goctl-swag.git
Documentation: pkg.go.dev

# README

goctl-swag

🌍 简体中文 ∙ English
Swagger 2.0 文档

简介

本项目是基于go-zero写的一个插件,用于根据go-zero的api 生成swagger文档,目前只支持swagger2.0版本,另外添加了前端的页面增强部分, 使用了swagger-bootstrap作为前端页面部分的增强, 借鉴了goctl-swagger一部分思路和代码, 使用了go-openapi作为swagger的解析和生成。

也正好借助这个项目对go-zero有了更深的了解(我刚接触go-zero不久)

目录

安装插件

go install github.com/CloverOS/goctl-swag/cmd/goctl-swag@latest

快速开始

先安装好goctl(版本为1.5.4)以及goctl-swag插件

  • 以testdata/go-zero/user.api为例,进行文档生成
git clone https://github.com/CloverOS/goctl-swag
cd goctl-swag
  • 下载本项目后,接着执行以下指令
goctl api plugin -p goctl-swag="init" -api testdata/user.api -dir testdata/go-zero/user 
  • 就会在testdata/go-zero/user/doc生成一个doc_gin.go文件,这个文件就是swagger文档的生成文件,里面包含了swagger的json数据和前端页面的增强部分的整合。

  • 最后执行以下指令生成go-zero项目(可以参考goctl-插件指令

goctl api go -api testdata/user.api -dir testdata/go-zero/user 
  • 进行页面增强适配 修改test/data/go-zero/user/user.go如下,使用gin作为router(推荐)
func main() {
    flag.Parse()

    var c config.Config
    conf.MustLoad(*configFile, &c)

    r := gin.NewRouter()
    server := rest.MustNewServer(c.RestConf, rest.WithRouter(r))
    defer server.Stop()

    ctx := svc.NewServiceContext(c)
    handler.RegisterHandlers(server, ctx)
    //for gin-swagger-bootstrap doc
    server.AddRoute(rest.Route{
        Method:  http.MethodGet,
        Path:    "/swagger/*any",
        Handler: doc.WrapHandler(),
    })
    fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
    server.Start()
}
  • 使用默认路由写法
server.AddRoutes([]rest.Route{
    {
        Method:  http.MethodGet,
        Path:    "/swagger",
        Handler: goctl_swag.Doc("/swagger", "dev"),
    },
    {
        Method: http.MethodGet,
        Path:   "/swagger-json",
        Handler: func (writer http.ResponseWriter, request *http.Request) {
            writer.Header().Set("Content-Type", "application/json; charset=utf-8")
            _, err := writer.Write([]byte(doc.Doc))
            if err != nil {
                httpx.Error(writer, err)
            }
        },
    },
})
go mod tidy
go run testdata/go-zero/user/user.go -f testdata/go-zero/user/etc/user.yaml 

截图

index settings auth form json

goctl-swag指令说明

goctl-swag init [command options] [arguments...]
参数说明默认值
--hostAPI请求地址localhost:8888
--basepath, --bpURL请求前缀/
--dir, -d生成的doc.go的文件夹路径./doc
--webframe, --wb选择使用哪个框架gin
--cover, --cv选择是否自动覆盖文件true
--router, --rt是否生成路由信息true

格式说明

可以参考user.api

通用API信息

示例

info(
	title: "示例文档"
	desc: "文档描述"
	version: "1.0"
	basePath: "/v1"
	termsOfService: "[$https]swagger.io/terms/"
	contact_name: "khthink"
	contact_url: "[$https]khthink.cn"
	contact_email: "example"
	license_name: "Apache 2.0"
	license_url: "[$https]www.apache.org/licenses/LICENSE-2.0.html"
	BasePath: "/v1"
	accept: "json"
	produce: "json"
	schemes: "http,https"
	securityDefinitions_apikey: "AccessToken"
	in: "header"
	name: "Access-Token"
)
注释说明
title必填 应用程序的名称。
version必填 提供应用程序API的版本。
description应用程序的简短描述。
termsOfServiceAPI的服务条款。
contact_name公开的API的联系信息。
contact_url联系信息的URL。 必须采用网址格式。
contact_email联系人/组织的电子邮件地址。 必须采用电子邮件地址的格式。
license_name必填 用于API的许可证名称。
license_url用于API的许可证的URL。 必须采用网址格式。
host运行API的主机(主机名或IP地址)。
BasePath运行API的基本路径。
acceptAPI 可以使用的 MIME 类型列表。 请注意,Accept 仅影响具有请求正文的操作,例如 POST、PUT 和 PATCH。 值必须如“Mime类型”中所述。
produceAPI可以生成的MIME类型的列表。值必须如“Mime类型”中所述。
schemes用,分隔的请求的传输协议。

关于无法使用"https://"类似的这种字符串的问题,可以使用[$https]这种方式来解决,会自动替换为https://

[$https] ==> https://
[$http] ==> http://
[$ws] ==> ws://
[$wss] ==> wss://

API声明

@doc(
    summary: "登录"
    description: "客户端用户登录"
)
@handler jsonLoginHandler
post /users/login (JsonRequest) returns (TokenResponse)

或者简写

@doc "表单登录"
@handler formLoginHandler
post /users/form/login (FormRequest)

API分组声明

@server(
    group: login
    open: true
    prefix: /login
    tag: 登录模块
)
  • open: true 代表该模块是否为开放接口,不写的话默认为私有接口(即false)

请求参数声明

Json

JsonRequest {
    RequestId string `header:"requestId"`       //请求id
    Account   string `json:"account"`           //账号
    Password  string `json:"password"`          //密码
    SecCode   string `json:"sec_code,optional"` //安全密码
}

文件上传

UploadRequest {
    MyFile string `form:"myFile,file"` //文件
}

Mime类型

swag 接受所有格式正确的MIME类型, 即使匹配 */*。除此之外,swag还接受某些MIME类型的别名,如下所示:

AliasMIME Type
jsonapplication/json
xmltext/xml
plaintext/plain
htmltext/html
mpfdmultipart/form-data
x-www-form-urlencodedapplication/x-www-form-urlencoded
json-apiapplication/vnd.api+json
json-streamapplication/x-json-stream
octet-streamapplication/octet-stream
pngimage/png
jpegimage/jpeg
gifimage/gif

参数类型

  • query
  • path
  • header
  • body
  • formData

数据类型

  • string (string)
  • integer (int, uint, uint32, uint64)
  • number (float32)
  • boolean (bool)
  • user defined struct

聚合Api文档用法

在生成的doc_gin.go中,有一个WrapHandlerWithGroupObject方法,可以将多个api文档聚合到一个文档中,用法如下:

doc.WrapHandlerWithGroupObject([]gen.SwaggerGroupObject{
    {
        Name:           "user",
        Url:            "../swagger/user.json",
        SwaggerVersion: "2.0",
        Location:       "",
    },
    {
        Name:           "order",
        Url:            "localhost:8889",
        SwaggerVersion: "2.0",
        Location:       "",
    },
})
  • 这里url填写不同微服务的swag文档数据,之后就可以在页面的左上角中选择对应的微服务文档了 group

感谢

go-zero
goctl-swagger
go-openapi

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author