golang生成swagger文档一直没有很好的方式,官方推荐的是通过注释生成文档,但是缺陷是注释很难写,IDE又没有自动提示
今天发现一款不错的三方包,可以直接基于golang代码生成文档
github.com/clearcodecn/swaggos
# Swaggos
swaggos 是一个golang版本的swagger文档生成器,提供了native code包装器.
## 安装
```
go get -u github.com/clearcodecn/swaggos
```
## 使用
### 创建实例
> 创建一个新的实例,配置一些基本信息 `host` 和 `apiPrefix`
```
doc := swaggos.Default()
doc.HostInfo("www.github.com","/api/v1")
// default is application/json
doc.Produces("application/json")
// default is application/json
doc.Consumes("application/json")
```
### Authorization
项目支持swagger的所有鉴权方式:`oauth2`, `basic auth`, `apiKey`
#### Oauth2
```
var scopes = []string{"openid"}
var tokenURL = "https://yourtokenurl"
var authURL = "https://yourAuthURL"
// config password flow
doc.Oauth2Password(tokenURL,scopes)
// access code
doc.Oauth2AccessCode(authURL,tokenURL,scopes)
// client
doc.Oauth2Client(tokenURL,scopes)
// implicit
doc.Oauth2Implicit(authURL,scopes)
```
#### Basic Auth
```
doc.Basic()
```
#### 自定义Token
> 会在header中增加`access_token`参数
```
doc.JWT("access_token")
```
### 公共参数
```
// will create header param in each request
doc.Header("name","description",true)
doc.Query("name","description",true)
doc.Form("name","description",true)
```
### 请求路劲
> path 是一个请求的实例,支持流式写法.
```
// 创建一个 path
path := doc.Get("user_information")
path.
Tag("tagName"). // 创建 tag
Summary("summary"). // 总结
Description("...."). // 描述
ContentType("application/json","text/html"). // 请求/响应类型
// path params
path.Form("key",swaggos.Attribute{})
// form files
path.FormFile("file",swaggos.Attribute{Required:true})
// form object reference
path.FormObject(new(User))
// query object
path.QueryObject(new(User))
// body
path.Body(new(User))
// json response
path.JSON(new(User))
// Attribute rules:
type Attribute struct {
Model string `json:"model"` // key name
Description string `json:"description"` // description
Required bool `json:"required"` // if it's required
Type string `json:"type"` // the param type
Example interface{} `json:"example"` // example value
Nullable bool `json:"nullable,omitempty"` // if it's nullable
Format string `json:"format,omitempty"` // format
Title string `json:"title,omitempty"` // title
Default interface{} `json:"default,omitempty"` // default value
Maximum *float64 `json:"maximum,omitempty"` // max num
Minimum *float64 `json:"minimum,omitempty"` // min num
MaxLength *int64 `json:"maxLength,omitempty"` // max length
MinLength *int64 `json:"minLength,omitempty"` // min length
Pattern string `json:"pattern,omitempty"` // regexp pattern
MaxItems *int64 `json:"maxItems,omitempty"` // max array length
MinItems *int64 `json:"minItems,omitempty"` // min array length
Enum []interface{} `json:"enum,omitempty"` // enum values
Ignore bool `json:"ignore"` // if it's ignore
Json string `json:"json"` // key name
}
```
### 路劲响应
```
// 响应json,创建model
path.JSON(new(Response))
// will provide a example response
// 400
path.BadRequest(map[string]interface{
"data": nil,
"code": 400,
})
// 401
path.UnAuthorization(v)
// 403
path.Forbidden(v)
// 500
path.ServerError(v)
```
### 分组
> 分组将对api进行分组,组下面的所有路劲会共享分组的公共参数
```
g := doc.Group("/api/v2")
g.Get("/user") // --> /api/v2/user
// ... other methods
g.Form ...
g.Query ...
g.Header ...
```
### 全局响应
```
doc.Response(200, new(Success))
doc.Response(400, new(Fail))
doc.Response(500, new(ServerError))
```
### 结构体的tag支持
```
type User struct {
// 字段名称 model > json
// this example field name will be m1
ModelName string `model:"m1" json:"m2"`
// 字段名会是 username
Username string `json:"username"`
// 字段名会是 Password
Password string
// 会被忽略
Ignored `json:"-"`
// 是否必须
Required string `required:"true"`
// 字段的描述
Description string `description:"this is description"`
// 字段的类型: string,integer,time,number,boolean,array...
Type string `type:"time"`
// 默认值 abc
DefaultValue string `default:"abc"`
// 最大值 100
Max float64 `maximum:"100"`
// 最小值 0
Min float64 `min:"0"`
// 最大长度 20
MaxLength string `maxLength:"20"`
// 最小长度 10
MinLength string `minLength:"10"`
// 正则表达式规则
Pattern string `pattern:"\d{0,9}"`
// 数组长度 小于3
MaxItems []int `maxItems:"3"`
// 数组长度大于3
MinItem []int `minItems:"3"`
// 枚举,用 , 分割
EnumValue int `enum:"a,b,c,d"`
// 忽略字段
IgnoreField string `ignore:"true"`
// 匿名字段规则:
// 如果是一个基本类型,则直接添加,
// 如果是一个 数组,也将直接添加
// 如果是一个结构体 但是带了json tag,将会作为一个字段
// 如果是一个结构体 带没有json tag,将会将里面的子字段添加上该结构体上
Anonymous
}
```
### 构建json和yaml
```
data,_ := doc.Build()
fmt.Println(string(data))
=> this is the swagger schema in json format
data,_ := doc.Yaml()
fmt.Println(string(data))
=> yaml format
```
### 提供 http 服务
```
http.Handle("/swagger",doc)
```
> Tips: examples 目录下面有少量的示例
## Contact Me
QQ群: 642154119
![wechat](./images/wechat.png)