简介
对于 API 服务来说, 文档是必不可少的.
然而文档却挺烦人的, 尤其是同步更新的问题. 如果选择手写文档, 经常会忘了更新文档; 或者处于高速开发的前期, 来不及更新文档.
文档即注释
文档即测试
这就是 swagger.
swagger 起步
swagger 提供了很多工具用于创建 API 文档, 尤其是创建了 RESTful APIs 标准.
OpenAPI Specification2.03.02.0
2.0
安装 swag 工具, 也可以直接下载预编译的二进制文件.
go get -u github.com/swaggo/swag/cmd/swag
复制代码
swag init
swag init
复制代码
swag-gin
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files
复制代码
到这里, 依赖已经安装完成了, 剩下的就是编写文档了.
编写文档
毕竟是一种规范, 还是要学习它的使用方式的, 如果有兴趣, 可以看 原始的规范.
这里看 swag 库的文档就行了, Declarative Comments Format.
@key value
main
// @title Apiserver API
// @version 1.0
// @description This is a simple api server.
// @contact.name coolcat
// @contact.url http://coolcat.io/support
// @contact.email help@coolcat.io
// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
// @host 127.0.0.1:8081
// @BasePath /v1
// @securityDefinitions.apikey ApiKeyAuth
// @in header
// @name Authorization
func main() {
cmd.Execute()
}
复制代码
在上面的注释里, 主要有四部分, 分别定义了:
- 标题, 版本号, 描述
- 联系信息
- license
- 安全定义
router.go
import {
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
// docs is generated by Swag CLI, you have to import it.
_ "tzh.com/web/docs"
}
func Load(g *gin.Engine, mw ...gin.HandlerFunc) *gin.Engine {
...
// swagger 文档
// The url pointing to API definition
// /swagger/index.html
url := ginSwagger.URL("/swagger/doc.json")
g.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url))
...
}
复制代码
剩下的就是编写每个接口的文档了, 举个例子, login 接口的文档如下:
// @Summary 登录
// @Description 登录账户, 获取 token
// @Tags login
// @Accept json
// @Produce json
// @Param body body model.UserModel true "User login""
// @Success 200 {object} model.Token "{"code":0,"message":"OK","data":{"token":"name"}}"
// @Router /login [post]
func Login(ctx *gin.Context) {
复制代码
这里定义了接口的基本属性, 包括路径, 请求类型, 成功时的输出, 输出格式等.
// @Summary 获取用户
// @Description 从数据库中获取用户信息
// @Tags user
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param id path uint64 true "user id in database"
// @Success 200 {object} model.UserModel "{"code":0,"message":"OK","data": {}}"
// @Router /user/{id} [get]
func Get(ctx *gin.Context) {
复制代码
@Security ApiKeyAuthmainApiKeyAuth
swag init
/swagger/index.html
更多的文档注释, 可以在源代码中查看.
运行
swag init
build: updoc
go build -ldflags ${ldflags} ./
run: updoc
go run -ldflags ${ldflags} ./
docker: updoc
go run -ldflags ${ldflags} ./ -c ./conf/config_docker.yaml
updoc:
go mod download
go get -u github.com/swaggo/swag/cmd/swag
swag init
复制代码
make runhttp://localhost:8081/swagger/index.htmlhttp://localhost:8081/swagger/doc.json
总结
swagger 为文档的编写提供了极大的便利, 工具虽好, 更重要的是坚持.
当前部分的代码
作为版本 v0.16.0