5.3 Swagger了解一下
在上一节,我们完成了一个服务端同时支持Rpc和RESTful Api后,你以为自己大功告成了,结果突然发现要写Api文档和前端同事对接= = 。。。
你寻思有没有什么组件能够自动化生成Api文档来解决这个问题,就在这时你发现了Swagger,一起了解一下吧!
介绍
Swagger
Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发
Swagger是目前最受欢迎的RESTful Api文档生成工具之一,主要的原因如下
跨平台、跨语言的支持
强大的社区
生态圈 Swagger Tools(Swagger Editor、Swagger Codegen、Swagger UI ...)
强大的控制台
同时grpc-gateway也支持Swagger
[image]
OpenAPI规范
OpenAPI规范OpenAPI规范是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程。OpenAPI规范帮助我们描述一个API的基本信息,比如:
有关该API的一般性描述
可用路径(/资源)
在每个路径上的可用操作(获取/提交...)
每个操作的输入/输出格式
目前V2.0版本的OpenAPI规范(也就是SwaggerV2.0规范)已经发布并开源在github上。该文档写的非常好,结构清晰,方便随时查阅。
注:OpenAPI规范的介绍引用自原文
使用
生成Swagger的说明文件
Swagger的说明文件第一,我们需要检查$GOBIN下是否包含protoc-gen-swagger可执行文件
若不存在则需要执行:
等待执行完毕后,可在$GOPATH/bin下发现该执行文件,将其移动到$GOBIN下即可
第二,回到$GOPATH/src/grpc-hello-world/proto下,执行命令
成功后执行ls即可看到hello.swagger.json文件
下载Swagger UI文件
Swagger UI文件Swagger提供可视化的API管理平台,就是Swagger UI
我们将其源码下载下来,并将其dist目录下的所有文件拷贝到我们项目中的$GOPATH/src/grpc-hello-world/third_party/swagger-ui去
将Swagger UI转换为Go源代码
Swagger UI转换为Go源代码在这里我们使用的转换工具是go-bindata
它支持将任何文件转换为可管理的Go源代码。用于将二进制数据嵌入到Go程序中。并且在将文件数据转换为原始字节片之前,可以选择压缩文件数据
安装
完成后,将$GOPATH/bin下的go-bindata移动到$GOBIN下
转换
在项目下新建pkg/ui/data/swagger目录,回到$GOPATH/src/grpc-hello-world/third_party/swagger-ui下,执行命令
检查
回到pkg/ui/data/swagger目录,检查是否存在datafile.go文件
Swagger UI文件服务器(对外提供服务)
Swagger UI文件服务器(对外提供服务)在这一步,我们需要使用与其配套的go-bindata-assetfs
它能够使用go-bindata所生成Swagger UI的Go代码,结合net/http对外提供服务
安装
编写
通过分析,我们得知生成的文件提供了一个assetFS函数,该函数返回一个封装了嵌入文件的http.Filesystem,可以用其来提供一个HTTP服务
那么我们来编写Swagger UI的代码吧,主要是两个部分,一个是swagger.json,另外一个是swagger-ui的响应
serveSwaggerFile
引用包strings、path
在函数中,我们利用r.URL.Path进行路径后缀判断
主要做了对swagger.json的文件访问支持(提供https://127.0.0.1:50052/swagger/hello.swagger.json的访问)
serveSwaggerUI
引用包github.com/elazarl/go-bindata-assetfs、grpc-hello-world/pkg/ui/data/swagger
在函数中,我们使用了go-bindata-assetfs来调度先前生成的datafile.go,结合net/http来对外提供swagger-ui的服务
结合
在完成功能后,我们发现path.Join("proto", p)是写死参数的,这样显然不对,我们应该将其导出成外部参数,那么我们来最终改造一番
首先我们在server.go新增包全局变量SwaggerDir,修改cmd/server.go文件:
修改path.Join("proto", p)为path.Join(SwaggerDir, p),这样的话我们swagger.json的文件路径就可以根据外部情况去修改它
最终server.go文件内容:
测试
访问路径https://127.0.0.1:50052/swagger/hello.swagger.json,查看输出内容是否为hello.swagger.json的内容,例如: [image]
访问路径https://127.0.0.1:50052/swagger-ui/,查看内容 [image]
小结
至此我们这一章节就完毕了,Swagger和其生态圈十分的丰富,有兴趣研究的小伙伴可以到其官网认真研究
而目前完成的程度也满足了日常工作的需求了,可较自动化的生成RESTful Api文档,完成与接口对接
参考
示例代码
Last updated
Was this helpful?