在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义。swagger给我们提供了一种新的维护文档的方式,在gin中只需要编写一些注释即可生成一份可交互的接口文档。

go get -u github.com/swaggo/swag/cmd/swag
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

引入这些包之后就可以通过给方法写注释的方式生成接口文档。github.com/swaggo/swag/cmd/swag中包含一个用于生成接口文档的命令行工具swag,github.com/swaggo/gin-swagger是一个gin中间件,github.com/swaggo/files中包含了swagger UI的一些如css、js等必要的文件。

与gin集成

我们需要在代码中引入必要的包,并且在main方法上增加两个必填的通用API注释title和version,这两个注释分别表示应用程序的名称和应用程序API的版本,这些内容会显示在swagger ui中。代码如下:

package main

import (
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
_ "proj/docs"
) // @title 用户中心API
// @version 1.0
func main() {
engine := gin.Default() url := ginSwagger.URL("/swagger/doc.json")
engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url)) _ = engine.Run(":8081")
}

我们在代码中定义doc.json的文件地址为/swagger/doc.json,swagger ui会解析这个地址渲染页面。紧接着定义路由规则/swagger/*any全部经由ginSwagger.WrapHandler中间件处理。

在包含main.go文件的项目根目录运行swag init。这将会解析注释并生成docs/docs.go和swagger所需的文件,最后引用docs_ "proj/docs",proj是项目名。

现在访问http://localhost:8081/swagger/index.html就会看到熟悉的swagger ui页面。

编写接口注释信息

type SysRole struct {
Id int64 `json:"id"`
Name null.String `json:"name" swaggertype:"string"` // 角色名
Description null.String `json:"description" swaggertype:"string"`
Available null.Int `json:"available" swaggertype:"integer"`
CreateTime null.Time `json:"create_time" db:"create_time" swaggertype:"string"` // 添加时间
UpdateTime null.Time `json:"update_time" db:"update_time" swaggertype:"string"` // 更新时间
} // 角色列表
// @Summary 角色列表
// @Description 角色列表
// @Tags 角色
// @Success 200 {array} SysRole
// @Router /roles [get]
func RoleList(c *gin.Context) {
list := sysRole.GetAllRole() c.JSON(http.StatusOK, list)
}

我们分别在model和handler方法上增加一些必要的信息。

Name字段在SysRole结构体中的类型为null.String,但是swag init生成文档时因为不能自动解析null包产生如下错误信息:

ParseComment error in file xxxxxxx.go :cannot find package path of type: null.String

一种解决方案是命令改为执行swag init --parseDependency解析外部依赖,这个命令需要解析大量的外部依赖运行时间很长,而且似乎也并不能解决所有问题。更推荐使用以上代码中的swaggertype标签来解决问题。swaggertype标签指定swagger中使用的类型,如int类型字段设置标签为swaggertype:"integer"

handler方法上增加注释描述当前接口的信息。@Summary和@Description设置接口的概要和描述信息。@Tags设置接口的分组,例如有接口 /roles 和 /roles/[:id] 都返回角色相关的信息,那么这两个handler的注释可以统一设置为 @Tags 角色。@Success设置接口成功返回的内容,这里设置为SysRole数组,当然还有@Failure设置接口失败的返回结果。@Router设置接口的路由。

文章出处:基于gin的golang web开发:集成swagger

基于gin的golang web开发:集成swagger的更多相关文章

  1. 基于gin的golang web开发:模型验证

    Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发 ...

  2. 基于gin的golang web开发:路由

    Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...

  3. 基于gin的golang web开发:路由二

    在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...

  4. 基于gin的golang web开发:模型绑定

    在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...

  5. 基于gin的golang web开发:访问mysql数据库

    web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有 ...

  6. 基于gin的golang web开发:使用数据库事务

    在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go ...

  7. 基于gin的golang web开发:mysql增删改查

    Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...

  8. 基于gin的golang web开发:中间件

    gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等 ...

  9. 基于gin的golang web开发:永远不要相信用户的输入

    作为后端开发者我们要记住一句话:"永远不要相信用户的输入",这里所说的用户可能是人,也可能是另一个应用程序."永远不要相信用户的输入"是安全编码的准则,也就是说 ...

随机推荐

  1. 【CF1428D】Bouncing Boomerangs 题解

    原题链接 题意简介 毒瘤大模拟 给你一张n*n的图,在图上摆有一些物体.从每一列的底端往上扔回旋镖,每镖中一个东西,回旋镖就会向右转九十度.现在我们知道从每列i底端往上镖时撞上的物体个数ai,试构造出 ...

  2. swoole为什么不建议使用static和global

    $http = new swoole_http_server("0.0.0.0", 9501); $http->on("request", functio ...

  3. Halcon软件介绍与图像基本知识

    1.halcon环境 halcon功能:1.视觉算法(核心)基本 2. 弱语言 3.解释性语言 halcon软件介绍: 1.标题栏 2.菜单栏 3.工具栏 4.工作区 图形窗口(显示图像) 变量窗口( ...

  4. LNOI 2020 退役记

    不会爆零了吧嘤嘤嘤 \(Day -7\) 周五正在上化学珂,突然被老师叫出去说省选还有名额,问我报不报名.啊嘞嘞还有一周了告诉我还有名额?经过了激烈的思想斗争,还是决定停课搞一搞,学一回OI好歹看看省 ...

  5. Ubuntu20.4安装

    官网下载镜像 https://releases.ubuntu.com/20.04/ubuntu-20.04-live-server-amd64.iso 挂载开装 选语言 选键盘 网络设置DHCP到地址 ...

  6. C#文件序列化

    前言 最近,为了实现Unity游戏数据的加密,我都把注意力放到了C#的加密方式身上,最简单的莫过于C#的序列化了,废话不多说,直接开始 准备工作 在使用文件序列化前我们得先引用命名空间 using S ...

  7. 使用Node.js原生API写一个web服务器

    Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...

  8. Ignite、Vertx

    Ignite IpFinder 默认采用multicast的ip发现方式 优点: 集群较小时,配置方便 缺点 集群较大100s-1000s时,广播非常耗时,此时建议使用ZooKeeper发现机制(Zo ...

  9. 数据结构(C++)——顺序表

    顺序表和链表的比较 1.存取方式 顺序表可以随机访问,而链表只能从表头顺序查找.(因此经常查找顺序表某一个元素时,顺序表更适合) 2.逻辑结构与物理结构 顺序表中,逻辑上相邻的元素,其物理存储位置也相 ...

  10. 面试官:看你简历说写精通ThreadLocal,这几道题你都会吗?

    问题 和Synchronized的区别 存储在jvm的哪个区域 真的只是当前线程可见吗 会导致内存泄漏么 为什么用Entry数组而不是Entry对象 你学习的开源框架哪些用到了ThreadLocal ...