API代码与文档同步

从go的代码注释到生成swagger.json服务说明文档,使用了beego框架的功能,其parse了代码特定格式的注释,生成了符合swargerV2.0规范的说明文档。

routers/router.go中的注释,对应生产的内容:

  1. // @APIVersion 1.0.0
  2. // @Title horizon-robotics deep-learning-uni-api-server
  3. // @Description documents of server API powered by swagger, you can also generate client code by swagger. refer : https://github.com/swagger-api/swagger-codegen
  4. // @Contact ming.zhao@hobot.cc
  5. // @TermsOfServiceUrl http://www.horizon.ai/
  6. // @License Apache 2.0
  7. // @LicenseUrl http://www.apache.org/licenses/LICENSE-2.0.html

golang 使用Beego + Swagger构建更好的API服务 - 图1

在controller中的注释

  1. // @Title Get 1 job's detail info
  2. // @Description Get 1 job's detail info
  3. // @Param appid body string true "your appid"
  4. // @Param appkey body string true "your appkey"
  5. // @Param job_id body string true "unique job id: eg. mobilenetres0.75_norm_1501205873"
  6. // @Success 200 {object} models.Jobinfo "ok"
  7. // @Failure 400 {object} models.RetObj "paras missing"
  8. // @Failure 500 {object} models.RetObj "do not have this job"
  9. // @router /get-job-detail [post]
  10. func (c *JobqueryController) GetDetail() {...
  11. }

对应生成的内容
golang 使用Beego + Swagger构建更好的API服务 - 图2
在修改代码的同时,只要顺手保证注释同步更新,并使用 bee run -downdoc=true -gendoc=true 就可以得到最新的API说明文档并可以手动“try it out”。

Swagger 和 OpenApi 规范
我们现在使用的主要是V2的版本,其规范细节如链接。一个更好理解的可视化版本如下图,组成的最主要的部分已经全部给出:
golang 使用Beego + Swagger构建更好的API服务 - 图3
Swagger项目本身的初衷是给出一个能力:只需要编写约定好的规范的服务说明文档,就可以分别生成服务端和客户端代码,特别适合产品快速的原型搭建。swagger.json可以手写,也可以使用专门的编辑器。
阅读完这个教程,你就可以比较熟练的编写规范的说明文档。

writing-openapi-swagger-specification-tutorial
golang 使用Beego + Swagger构建更好的API服务 - 图4

生产client代码

调用API服务的客户端sdk代码逻辑其实都很类似,只不过不同的语言和运行设备需要不同的实现。另,如果API有微小的调整,多个版本的sdk还需要分别修改,这样十分不便于维护。现在基于go code同步生成的swagger.json,可以一次生成多种语言的sdk代码,十分快捷方便。

  1. #!/bin/bash
  2. #in mac, use brew install swagger-codegen.
  3. #refer:https://github.com/swagger-api/swagger-codegen
  4. Available languages: [akka-scala, android, apache2, apex, aspnet5, aspnetcore, async-scala, bash, csharp, clojure, cwiki, cpprest, CsharpDotNet2, dart, elixir, eiffel, erlang-server, finch, flash, python-flask, go, go-server, groovy, haskell, jmeter, jaxrs-cxf-client, jaxrs-cxf, java, inflector, jaxrs-cxf-cdi, jaxrs-spec, jaxrs, msf4j, java-play-framework, jaxrs-resteasy-eap, jaxrs-resteasy, javascript, javascript-closure-angular, java-vertx, kotlin, lumen, nancyfx, nodejs-server, objc, perl, php, php-symfony, powershell, pistache-server, python, qt5cpp, rails5, restbed, ruby, scala, scalatra, silex-PHP, sinatra, slim, spring, dynamic-html, html2, html, swagger, swagger-yaml, swift4, swift3, swift, tizen, typescript-angular2, typescript-angular, typescript-fetch, typescript-jquery, typescript-node, undertow, ze-ph]
  5. swagger-codegen generate -i http://petstore.swagger.io/v2/swagger.json -l php -o ./gencode

如上的一个命令会基于http://petstore.swagger.io/v2/swagger.json 生成php调用的sdk代码
golang 使用Beego + Swagger构建更好的API服务 - 图5


golang 使用Beego + Swagger构建更好的API服务 - 图6