前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用go-swagger为golang API自动生成swagger文档

使用go-swagger为golang API自动生成swagger文档

作者头像
李海彬
发布于 2018-07-26 01:46:26
发布于 2018-07-26 01:46:26
10.5K20
代码可运行
举报
文章被收录于专栏:Golang语言社区Golang语言社区
运行总次数:0
代码可运行

什么是swagger?

Swagger是一个简单但功能强大的API表达工具。它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言,都在支持和使用Swagger。使用Swagger生成API,我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。

swagger文档长啥样?

一个最简单的swagger文档示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1swagger: "2.0"
 2info:
 3  version: 1.0.0
 4  title: Simple API
 5  description: A simple API to learn how to write OpenAPI Specification
 6schemes:
 7  - https
 8host: simple.api
 9basePath: /openapi101
10paths: {}

Tips:阅读本文前提是假设你已经了解了如何编写swagger文档,当然,如果还不了解也没关系,可以去swagger官网查看文档进行学习,并且这里还有一套《Swagger从入门到精通》附上.

本文背景介绍

写作本文的原因是因为公司要求api文档都使用 swagger格式,项目是用golang编写的,作为一个懒癌程序员,怎么能够忍受去编写这么复杂的swagger文档呢?有没有一键生成的工具呢?google一下,还真有,那就是go-swagger项目。go-swagger众多特色功能之一就是Generate a spec from source,即通过源码生成文档,很符合我的需求。

下面就简单介绍下如何为项目加上swagger注释,然后一键生成API文档。

开始之前需要安装两个工具:

  • swagger-editor:用于编写swagger文档,UI展示,生成代码等...
  • go-swagger:用于一键生成API文档

安装swagger-editor,我这里使用docker运行,其他安装方式,请查看官方文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1docker pull swaggerapi/swagger-editor
2docker run --rm -p 80:8080 swaggerapi/swagger-editor

安装go-swagger,我这边使用brew安装,其他安装方式,请查看官方文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1brew tap go-swagger/go-swagger
2brew install go-swagger

好了,现在终于开始正题:start coding!!!

开始编写注释

1.假设有一个user.server,提供一些REST API,用于对用户数据的增删改查。

比如这里有一个getOneUser接口,是查询用户信息的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package service
 2import (
 3    "encoding/json"
 4    "fmt"
 5    "net/http"
 6    "strconv"
 7    "user.server/models"
 8    "github.com/Sirupsen/logrus"
 9)
10type GetUserParam struct {
11    Id int `json:"id"`
12}
13func GetOneUser(w http.ResponseWriter, r *http.Request) {
14    defer r.Body.Close()
15    decoder := json.NewDecoder(r.Body)
16    var param GetUserParam
17    err := decoder.Decode(&param)
18    if err != nil {
19        WriteResponse(w, ErrorResponseCode, "request param is invalid, please check!", nil)
20        return
21    }
22    // get user from db
23    user, err := models.GetOne(strconv.Itoa(param.Id))
24    if err != nil {
25        logrus.Warn(err)
26        WriteResponse(w, ErrorResponseCode, "failed", nil)
27        return
28    }
29    WriteResponse(w, SuccessResponseCode, "success", user)
30}

根据swagger文档规范,一个swagger文档首先要有swagger的版本和info信息。利用go-swagger只需要在声明package之前加上如下注释即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1// Package classification User API.
 2//
 3// The purpose of this service is to provide an application
 4// that is using plain go code to define an API
 5//
 6//      Host: localhost
 7//      Version: 0.0.1
 8//
 9// swagger:meta
10package service

然后在项目根目录下使用swagger generate spec -o ./swagger.json命令生成swagger.json文件:

此命令会找到main.go入口文件,然后遍历所有源码文件,解析然后生成swagger.json文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1{
 2  "swagger": "2.0",
 3  "info": {
 4    "description": "The purpose of this service is to provide an application\nthat is using plain go code to define an API",
 5    "title": "User API.",
 6    "version": "0.0.1"
 7  },
 8  "host": "localhost",
 9  "paths": {}
10}

2.基本信息有了,然后就要有路由,请求,响应等,下面针对getOneUser接口编写swagger注释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1// swagger:parameters getSingleUser
 2type GetUserParam struct {
 3    // an id of user info
 4    //
 5    // Required: true
 6    // in: path
 7    Id int `json:"id"`
 8}
 9func GetOneUser(w http.ResponseWriter, r *http.Request) {
10    // swagger:route GET /users/{id} users getSingleUser
11    //
12    // get a user by userID
13    //
14    // This will show a user info
15    //
16    //     Responses:
17    //       200: UserResponse
18    decoder := json.NewDecoder(r.Body)
19    var param GetUserParam
20    err := decoder.Decode(&param)
21    if err != nil {
22        WriteResponse(w, ErrorResponseCode, "request param is invalid, please check!", nil)
23        return
24    }
25    // get user from db
26    user, err := models.GetOne(strconv.Itoa(param.Id))
27    if err != nil {
28        logrus.Warn(err)
29        WriteResponse(w, ErrorResponseCode, "failed", nil)
30        return
31    }
32    WriteResponse(w, SuccessResponseCode, "success", user)
33}

可以看到在GetUserParam结构体上面加了一行swagger:parameters getSingleUser的注释信息,这是声明接口的入参注释,结构体内部的几行注释指明了id这个参数必填,并且查询参数id是在url path中。详细用法,参考: swagger:params

GetOneUser函数中:

  • swagger:route指明使用的http method,路由,以及标签和operation id,详细用法,参考: swagger:route
  • Responses指明了返回值的code以及类型

然后再声明响应:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1// User Info
 2//
 3// swagger:response UserResponse
 4type UserWapper struct {
 5    // in: body
 6    Body ResponseMessage
 7}
 8type ResponseMessage struct {
 9    Code    int         `json:"code"`
10    Message string      `json:"message"`
11    Data    interface{} `json:"data"`
12}

使用swagger:response语法声明返回值,其上两行是返回值的描述(我也不清楚,为啥描述信息要写在上面,欢迎解惑),详细用法,参考; swagger:response

然后浏览器访问localhost,查看swagger-editor界面,点击工具栏中的File->Impoprt File上传刚才生成的 swagger.json文件,就可以看到界面:

这样一个简单的api文档就生成了

3.怎么样?是不是很简单?可是又感觉那里不对,嗯,注释都写在代码里了,很不美观,而且不易维护。想一下go-swagger的原理是扫描目录下的所有go文件,解析注释信息。那么是不是可以把api注释都集中写在单个文件内,统一管理,免得分散在各个源码文件内。

新建一个doc.go文件,这里还有一个接口是UpdateUser,那么我们在doc.go文件中声明此接口的api注释。先看一下UpdateUser接口的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1func UpdateUser(w http.ResponseWriter, r *http.Request) {
 2    defer r.Body.Close()
 3    // decode body data into user struct
 4    decoder := json.NewDecoder(r.Body)
 5    user := models.User{}
 6    err := decoder.Decode(&user)
 7    if err != nil {
 8        WriteResponse(w, ErrorResponseCode, "user data is invalid, please check!", nil)
 9        return
10    }
11    // check if user exists
12    data, err := models.GetUserById(user.Id)
13    if err != nil {
14        logrus.Warn(err)
15        WriteResponse(w, ErrorResponseCode, "query user failed", nil)
16        return
17    }
18    if data.Id == 0 {
19        WriteResponse(w, ErrorResponseCode, "user not exists, no need to update", nil)
20        return
21    }
22    // update
23    _, err = models.Update(user)
24    if err != nil {
25        WriteResponse(w, ErrorResponseCode, "update user data failed, please try again!", nil)
26        return
27    }
28    WriteResponse(w, SuccessResponseCode, "update user data success!", nil)
29}

然后再doc.go文件中编写如下声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1package service
 2import "user.server/models"
 3// swagger:parameters UpdateUserResponseWrapper
 4type UpdateUserRequest struct {
 5    // in: body
 6    Body models.User
 7}
 8// Update User Info
 9//
10// swagger:response UpdateUserResponseWrapper
11type UpdateUserResponseWrapper struct {
12    // in: body
13    Body ResponseMessage
14}
15// swagger:route POST /users users UpdateUserResponseWrapper
16//
17// Update User
18//
19// This will update user info
20//
21//     Responses:
22//       200: UpdateUserResponseWrapper

这样就把api声明注释给抽离出来了,然后使用命令swagger generate spec -o ./swagger.json生成json文件,就可以看到这样的结果:

很简单吧,参照文档编写几行注释,然后一个命令生成API文档。懒癌程序员福音~

本文所有示例代码托管在这里, 原文地址

参考:

  • swagger官方Doc
  • Swagger从入门到精通
  • go-swagger文档
  • go-swagger的github主页

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
给大佬顶顶帖子🤣
给大佬顶顶帖子🤣
回复回复点赞举报
没想到是18年的帖子😂
没想到是18年的帖子😂
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
PHP使用swagger-php自动生成api文档(详细附上完整例子)
如果是使用 git 克隆 swagger-ui,可以在当前项目的public目录下执行如下命令
meihuasheng
2021/07/08
7.8K0
Swagger自动生成API文档
最近安装并使用了一下Swagger-ui、Swagger-editor和Swagger-codegen,感觉还不错。
javascript.shop
2019/09/04
3.8K0
使用 Swagger 为 Go 项目生成 API 文档
Swagger 是一个基于 OpenAPI 规范设计的工具,用于为 RESTful API 生成交互式文档。本文将介绍如何在 Go 项目中集成 Swagger,特别是结合 Gin 框架生成 API 文档。
浩瀚星河
2025/03/23
1750
使用 Swagger 为 Go 项目生成 API 文档
听说你还不会jwt和swagger-饭我都不吃了带着实践项目我就来了
哈喽,大家好,我是asong,这是我的第八篇原创文章。听说你们还不会jwt、swagger,所以我带来一个入门级别的小项目。实现用户登陆、修改密码的操作。使用GIN(后台回复Golang梦工厂:gin,可获取2020GIN中文文档)作为web框架,使用jwt进行身份校验,使用swagger生成接口文档。代码已上传个人github:https://github.com/asong2020/Golang_Dream/tree/master/Gin/gin_jwt_swagger。有需要的自行下载,配有详细使用文档。
Golang梦工厂
2022/07/07
7900
听说你还不会jwt和swagger-饭我都不吃了带着实践项目我就来了
Swagger详细了解一下(长文谨慎阅读)
Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS)。 Swagger 可以贯穿于整个 API 生态,如 API 的设计、编写 API 文档、测试和部署。 Swagger 是一种通用的,和编程语言无关的 API 描述规范。
IT苦逼一枚
2020/04/27
32.8K0
Go每日一库之101:swagger
一份清晰明了的接口文档能够极大地提高前后端双方的沟通效率和开发效率。本文将介绍如何使用swagger生成接口文档。
luckpunk
2023/09/30
9280
如何构建交互式的RESTful API文档
相信后端开发同学都写过API文档,如果你只开发API接口而不写文档会估计会被喷,而且写文档确实是个好习惯。但是写文档这个事确实挺痛苦的,之前我的做法是在内部开发人员内部约定一个markdown模板来填写,类似api.md这种格式,每个接口都会有多个字段(URL,Method,Params)来说明。
xiaojunzhou
2019/05/27
1.5K0
使用Beego+Swagger构建更好的API服务
题图 By NewYorker From Twitter 一. 更好的API服务 在你已经在工作中写了很多版本,很多规范的API服务之后,你会发现,后端服务很多共性的工作需要去完成,比如: 1)良好的API说明文档,最好还附带可访问,试一试的服务url 2)为API提供多种语言的sdk(调用端代码:比如安卓,ios和php) 3)保证API文档和代码同步实时的更新(容易遗忘) 4)持续的性能profiling,优化 那么怎样很优雅的解决如上的问题呢? 一个比较好的方案是 beego代码注释 -> swa
李海彬
2018/03/19
2.3K0
使用Beego+Swagger构建更好的API服务
使用Golang和MySQL开发预约系统
在当今数字化的时代,预约系统在各个领域都得到了广泛的应用,如医院挂号预约、餐厅预订、旅行酒店预订等。本文将详细介绍如何使用Golang和MySQL开发一个简单的预约系统,涵盖系统的需求分析、数据库设计、代码实现以及测试和部署等方面。
用户3484293
2025/01/21
1210
Gin 生成 Swagger 接口文档
后台服务通过接口(如 RESTful API)对外提供服务时,需要有明确的接口文档。
恋喵大鲤鱼
2023/02/23
2.3K0
Gin 生成 Swagger 接口文档
什么是现货期权合约交易所系统开发丨现货期权合约交易所系统开发详解技术
通过mux定义了两个Handler,URL都是/,但是对应的Method是不一样的。
I357O98O7I8
2022/08/07
4790
使用JWT做RESTful API的身份验证-Go语言实现
在 使用Golang和MongoDB构建 RESTful API已经实现了一个简单的 RESTful API应用,但是对于有些API接口需要授权之后才能访问,在这篇文章中就用 jwt 做一个基于Token的身份验证,关于 jwt 请访问 JWT有详细的说明,而且有各个语言实现的库,请根据需要使用对应的版本。
李海彬
2018/07/26
1.6K0
使用JWT做RESTful API的身份验证-Go语言实现
Go每日一库之148:base64Captcha(多种形式验证码)
Base64captcha 几行代码就可以定义自己内容的图形验证码库,支持任意unicode字符的内容.
luckpunk
2023/10/02
2.3K0
『Beego + Swagger 快速上手』
大纲 Beego 是什么 为什么写这个 如何指导 前几天我写了一个Swagger 上手指南,觉得还是让使用者难以上手。尽管它是一款优秀的API 工具。 但我在编写API 的过程中发现几个问题: 编写繁琐:尽管会提示出关键字,但是不支持 yaml 自动换行,自动对齐等功能 保存不方便: 尽管可以到处yaml 或者json 格式的配置文件,但要是API 发生变更,又需要重新打开下载的包,或者在线版的Editor 不极客:Swagger 是给程序员使用的,但是单纯的配置文件,程序员不太喜欢,而是喜欢那种编程实现的
谢伟
2018/06/06
1.3K0
Swagger 详解
Swagger:The Best APIs are Built with Swagger Tools 。Swagger可以定义一个标准的RESTful风格的API,与语言无关,是一个API的规范。
Criss@陈磊
2019/08/02
1.8K0
超简单-自动生成接口文档
项目设计阶段写的接口文档,需求的不断的改动,导致前期定义的接口已面目全非。如果没有及时更新接口文档,那么这些接口文档对前端开发人员将是一场灾难!由于项目紧急,是没有时间完善接口文档,我们该如何提高前后端的开发效率呢?
不安分的猿人
2020/03/02
2.1K0
『No17: gin-swagger 构建自动化文档』
重要,前后端的交互一般流程是这样的,后端暴露出API后,交给前端,前端根据API的响应,编写前端页面,一定程度上API 是前后端的交互桥梁。
谢伟
2018/08/02
1.3K0
『No17: gin-swagger 构建自动化文档』
ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
将 Swagger 生成器添加到 Startup.ConfigureServices 方法中的服务集合中:
依乐祝
2018/09/18
3.4K0
ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
go2school-2
本次的 http server 也可以使用 web 框架,比如 iris 和 mux。(iris知名度高)
职场亮哥
2020/10/10
8250
Go语言golang 200行写区块链源代码分析
Github上有一个Repo,是一个使用Go语言(golang),不到200行代码些的区块链源代码,准确的说是174行。原作者起了个名字是 Code your own blockchain in less than 200 lines of Go! 而且作者也为此写了一篇文章。 https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc
飞雪无情
2020/02/10
1K0
推荐阅读
相关推荐
PHP使用swagger-php自动生成api文档(详细附上完整例子)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档