golang gin框架使用swagger生成接口文档

摘要:
本文介绍如何使用swagger生成接口文档。Swagger简介Swagger本质上是一种接口描述语言,用于描述JSON表示的RESTful API。在这里,我们以gin框架为例,使用gin swicker库使用Swagger 2.0自动生成RESTful API文档。使用swag工具扫描代码,自动生成API接口文档数据。使用杜松子酒渲染在线界面文档页面。步骤1:向程序项的主功能添加注释。以评论的形式写出项目的相关介绍信息。
前言

一份清晰明了的接口文档能够极大地提高前后端双方的沟通效率和开发效率。

本文将介绍如何使用swagger生成接口文档。

swagger介绍

Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言。Swagger与一组开源软件工具一起使用,以设计、构建、记录和使用RESTful Web服务。Swagger包括自动文档,代码生成和测试用例生成。

在前后端分离的项目开发过程中,如果后端同学能够提供一份清晰明了的接口文档,那么就能极大地提高大家的沟通效率和开发效率。可是编写接口文档历来都是令人头痛的,而且后续接口文档的维护也十分耗费精力。

最好是有一种方案能够既满足我们输出文档的需要又能随代码的变更自动更新,而Swagger正是那种能帮我们解决接口文档问题的工具。

这里以gin框架为例,使用gin-swagger库以使用Swagger 2.0自动生成RESTful API文档。

gin-swagger实战

想要使用gin-swagger为你的代码自动生成接口文档,一般需要下面三个步骤:

  1. 按照swagger要求给接口代码添加声明式注释,具体参照声明式注释格式
  2. 使用swag工具扫描代码自动生成API接口文档数据
  3. 使用gin-swagger渲染在线接口文档页面

第一步:添加注释

在程序入口main函数上以注释的方式写下项目相关介绍信息。

package main

// @title 这里写标题
// @version 1.0
// @description 这里写描述信息
// @termsOfService http://swagger.io/terms/

// @contact.name 这里写联系人信息
// @contact.url http://www.swagger.io/support
// @contact.email support@swagger.io

// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html

// @host 这里写接口服务的host
// @BasePath 这里写base path
func main() {
	r := gin.New()

	// liwenzhou.com ...

	r.Run()
}

在你代码中处理请求的接口函数(通常位于controller层)按如下方式写上注释:

// GetPostListHandler2 升级版帖子列表接口
// @Summary 升级版帖子列表接口
// @Description 可按社区按时间或分数排序查询帖子列表接口
// @Tags 帖子相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param object query models.ParamPostList false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} _ResponsePostList
// @Router /posts2 [get]
func GetPostListHandler2(c *gin.Context) {
	// GET请求参数(query string):/api/v1/posts2?page=1&size=10&order=time
	// 初始化结构体时指定初始参数
	p := &models.ParamPostList{
		Page:  1,
		Size:  10,
		Order: models.OrderTime,
	}

	if err := c.ShouldBindQuery(p); err != nil {
		zap.L().Error("GetPostListHandler2 with invalid params", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	data, err := logic.GetPostListNew(p)
	// 获取数据
	if err != nil {
		zap.L().Error("logic.GetPostList() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	ResponseSuccess(c, data)
	// 返回响应
}

上面注释中参数类型使用了 objectmodels.ParamPostList 具体定义如下:

// bluebell/models/params.go

// ParamPostList 获取帖子列表query string参数
type ParamPostList struct {
	CommunityID int64  `json:"community_id" form:"community_id"`   // 可以为空
	Page        int64  `json:"page" form:"page" example:"1"`       // 页码
	Size        int64  `json:"size" form:"size" example:"10"`      // 每页数据量
	Order       string `json:"order" form:"order" example:"score"` // 排序依据
}

响应数据类型也使用的 object,我个人习惯在controller层专门定义一个 docs_models.go 文件来存储文档中使用的响应数据model。

// bluebell/controller/docs_models.go

// _ResponsePostList 帖子列表接口响应数据
type _ResponsePostList struct {
	Code    ResCode                 `json:"code"`    // 业务响应状态码
	Message string                  `json:"message"` // 提示信息
	Data    []*models.ApiPostDetail `json:"data"`    // 数据
}

第二步:生成接口文档数据

编写完注释后,使用以下命令安装swag工具:

go get -u github.com/swaggo/swag/cmd/swag

Windows10 如果在goland中直接执行上述命令不生效,显示 'swag' 不是内部或外部命令,也不是可运行的程序或批处理文件,这时候可以在cmd小黑框执行,然后重启goland项目再执行 swag help,就可以看到swag已经成功安装上了。

第二步:生成接口文档数据

编写完注释后,使用以下命令安装swag工具:

go get -u github.com/swaggo/swag/cmd/swag

在项目根目录执行以下命令,使用swag工具生成接口文档数据。

swag init

执行完上述命令后,如果你写的注释格式没问题,此时你的项目根目录下会多出一个docs文件夹。

./docs
├── docs.go
├── swagger.json
└── swagger.yaml

第三步:引入gin-swagger渲染文档数据

然后在项目代码中注册路由的地方按如下方式引入gin-swagger相关内容:

import (
	// liwenzhou.com ...

	_ "bluebell/docs"  // 千万不要忘了导入把你上一步生成的docs

	gs "github.com/swaggo/gin-swagger"
	"github.com/swaggo/gin-swagger/swaggerFiles"

	"github.com/gin-gonic/gin"
)

注册swagger api相关路由

r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

把你的项目程序运行起来,打开浏览器访问 http://localhost:8080/swagger/index.html 就能看到Swagger 2.0 Api文档了。

gin-swagger 同时还提供了 DisablingWrapHandler 函数,方便我们通过设置某些环境变量来禁用Swagger。例如:

r.GET("/swagger/*any", gs.DisablingWrapHandler(swaggerFiles.Handler, "NAME_OF_ENV_VARIABLE"))

此时如果将环境变量 NAME_OF_ENV_VARIABLE设置为任意值,则 /swagger/*any 将返回404响应,就像未指定路由时一样。

免责声明:文章转载自《golang gin框架使用swagger生成接口文档》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CVE-2020-1472相关杂谈水晶报表中图片不显示解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#API接口调试工具

自从去年软件界网站开发推崇前后端分离,我们公司也在进行转行行,从原先的前端架构,后端架构,数据库搭建一肩挑的模式也逐渐转型为前后端分离,大量招收前端开发人员,原来的人员也转型为专职的后端开发,这样的变化就对于后端开发人员的接口调试带来了一定的麻烦,在原来的前后端一起的开发模式下,我们可以利用前端的请求直接后台打断点进行调试,然而进行了前后端分离以后,直接叫...

在Web应用中接入微信支付的流程之极简清晰版

背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可。 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布下的所有坑。 简要介绍几个主要大坑: 坑一:关于WeixinJSBridge这个对象 查阅网页端调起支付API的开发文档,此对象即旁若无人的映入眼帘。 然后我们就理所应当的在代码里调用了丫的。 可是,to...

Mybatis框架的输出映射类型

  Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。 resultType(输出类型) 1.输出简单类型 (1)我们在UserMapper接口中定义查找数据库中用户总人数的方法:   public Integer findUserCount(); (2)在UserMapper.xm...

JAVA-SPI机制-实现功能的热插拔

一、序:   开发中经常遇到的一个需求是,处理不同种类的数据,但是完成的功能是相似的,功能随着传入类型的不同而变化 二、方案:   1、定义接口:定义一个接口,编写不同的实现类     (1)使用场景:完成功能相同,参数也类似,只是内部的实现逻辑不同,可以编写接口实现的配置类,使用时动态获取实现类     (2)缺点:数据的类型必须确定     (3)举...

java8函数式接口(Functional Interface)

介绍 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 函数式接口可以被隐式转换为 lambda 表达式(箭头函数)。 函数式接口代表的一种契约, 一种对某个特定函数类型的契约。Lambda表达式不能脱离上下文而存在,它必须要有一个明确的目标类型(interface),而这个目标类型就是...

根据IP查询所在城市接口(查询用户所在城市)

转自:https://blog.csdn.net/liona_koukou/article/details/75646313 最近项目有用到定位用户客户端打开页面时所在的城市的需求,找到如下接口,做个记录 文章为转载 设计蜂巢IP地址查询接口:http://www.hujuntao.com/api/ip/ip.php 腾讯IP地址查询接口:http:/...