使用Gin编写Web API项目并自动化文档

最近需要使用Go写一个Web API项目,可以使用Beego与Gin来写此类项目,前文使用Beego创建API项目并自动化文档介绍了使用Beego来创建的Web API项目并自动化文档的方法。本文就介绍一下使用Gin来编写Web API项目并自动化文档。

一、创建项目

在创建Beego项目时,可以使用Beego的Bee命令来创建项目;而Gin没有类似的程序或者命令来创建项目,所以需要手动创建一个Go项目,新建一个目录,并进入该目录创建项目:

$ mkdir api
$ cd api
$ go mod init api
$ go mod tidy

二、添加代码

创建好项目后,即可使用VSCode或者Goland打开目录,开始工作了。项目结构可以参考Beego的Model-Controls方式:

$ tree
.
├── controls
│   └── user.go
├── go.mod
├── go.sum
├── main.go
├── models
│   └── user.go
└── routers└── router.go4 directories, 6 files

这里直接把源码贴出来:

main.go

package mainimport ("api/routers""github.com/gin-gonic/gin"
)func main() {r := gin.Default()routers.InitRouters(r)r.Run(":8080")
}

routers/router.go

package routersimport ("api/controls""github.com/gin-gonic/gin"
)func InitRouters(r *gin.Engine) {r.Group("v1").GET("users", controls.GetAllUsers)
}

models/user.go

package modelsvar (UserList map[string]*User
)type User struct {Id       stringUsername stringPassword stringProfile  Profile
}type Profile struct {Gender  stringAge     intAddress stringEmail   string
}func init() {UserList = make(map[string]*User)u := User{"user_888888", "witton", "888888", Profile{"male", 20, "成都", "witton@163.com"}}UserList["user_888888"] = &u
}func GetAllUsers() map[string]*User {return UserList
}

controls/user.go

package controlsimport ("api/models""net/http""github.com/gin-gonic/gin"
)func GetAllUsers(c *gin.Context) {c.JSON(http.StatusOK, models.GetAllUsers())
}

添加好代码后,执行:

$ go mod tidy

运行项目后,可以在浏览器中访问:http://127.0.0.1:8080/v1/users

在这里插入图片描述

就可以看到结果了。

三、自动化文档

与使用Beego创建API项目并自动化文档中说的一样,为了方便测试,需要引入swagger来自动化文档。

1. 安装最新swag

使用下面的命令安装最新的swag

go install github.com/swaggo/swag/cmd/swag@latest

2. 编写swag注释

修改controls/user.go,在GetAllUsers函数上添加注释:

package controlsimport ("api/models""net/http""github.com/gin-gonic/gin"
)// @Summary 获取所有用户
// @Produce  json
// @Success 200 {object} models.User
// @Router /v1/users [get]
func GetAllUsers(c *gin.Context) {c.JSON(http.StatusOK, models.GetAllUsers())
}

关于注释的格式,可以参考:
https://gitee.com/acrowise/swag
https://github.com/swaggo/swag/blob/master/README_zh-CN.md

3. 生成文档

使用swag init命令生成文档:

$ swag init
2024/05/06 14:36:57 Generate swagger docs....
2024/05/06 14:36:57 Generate general API Info, search dir:./
2024/05/06 14:36:57 create docs.go at docs/docs.go
2024/05/06 14:36:57 create swagger.json at docs/swagger.json
2024/05/06 14:36:57 create swagger.yaml at docs/swagger.yaml

生成文档后,会在根目录下创建一个docs目录,所有生成的文件都放在里面。

$ tree
.
├── controls
│   └── user.go
├── docs
│   ├── docs.go
│   ├── swagger.json
│   └── swagger.yaml
├── go.mod
├── go.sum
├── main.go
├── models
│   └── user.go
└── routers└── router.go5 directories, 9 files

4. 添加路由

routers/router.go中添加路由:

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

routers/router.go完整代码:

package routersimport ("api/controls"_ "api/docs""github.com/gin-gonic/gin"swaggerFiles "github.com/swaggo/files"ginSwagger "github.com/swaggo/gin-swagger"
)func InitRouters(r *gin.Engine) {r.Group("v1").GET("users", controls.GetAllUsers)r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
}

需要注意的是:swaggerFiles已经改名了,不再是"github.com/swaggo/gin-swagger/swaggerFiles",如果导入"github.com/swaggo/gin-swagger/swaggerFiles",则会报错:

go: finding module for package github.com/swaggo/gin-swagger/swaggerFiles
go: api/routers importsgithub.com/swaggo/gin-swagger/swaggerFiles: module github.com/swaggo/gin-swagger@latest found (v1.6.0), but does not contain package github.com/swaggo/gin-swagger/swaggerFiles 

需要导入"github.com/swaggo/files"

5. 运行测试

执行go mod tidy下载依赖后再启动项目,在浏览器中访问:http://127.0.0.1:8080/swagger/index.html,即可看到页面:

在这里插入图片描述

测试一下API:

在这里插入图片描述

可以看到正常的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/670973.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】高质量选择题

目录 题目一: 题目二: 题目三: 题目四: 题目五: 题目六: 题目七: 题目八: 题目九: 题目十: 题目十一: 题目十二: 题目十…

情感视频素材怎么来的?8个视频素材库免费下载安装

在今天这个视觉内容对于连接和影响观众至关重要的时代,选择适合的视频素材变得极为关键。优质的视频素材可以极大提升您的内容质量,无论是在增加社交媒体的吸引力、提升商业广告的效果,还是丰富教育材料的表现力。以下是一些全球顶级的视频素…

解决mac出现npm install 卡在“sill idealTree buildDeps“的问题

问题出现场景: 在新建一个项目尝试npm install命令时,一直卡在“sill idealTree buildDeps“ 尝试过的无效解决方案包括: 切换/关闭梯子重启更换网络更换npm源更新删除 package.json 最终解决方案: 引起问题的原因是MacOS设置中…

【携程笔试题汇总】[全网首发] 2024-05-06-携程春招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新携程近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢&#x1f49…

linux系统-PXE高效批量网络装机

目录 一、PXE概述 PXE批量部署的优点 搭建PXE网络体系的前提条件 二、搭建PXE远程安装服务器 1.修改网络配置 2 .老样子关防火墙!!!! 3.确保挂载状态 和yum库 4. 安装TFTP服务 5.修改TFTP服务的配置文件 6.启动服务 7…

JS基础:JS语法规范详解(最全!)

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端基础路线”,可获取完整web基础…

Redission分布式锁 watch dog 看门狗机制

为了避免Redis实现的分布式锁超时,Redisson中引入了watch dog的机制,他可以帮助我们在Redisson实例被关闭前,不断的延长锁的有效期。 自动续租:当一个Redisson客户端实例获取到一个分布式锁时,如果没有指定锁的超时时…

cordova build android 下载gradle太慢

一、 在使用cordova run android / cordova build android 的时候 gradle在线下载 对于国内的链接地址下载太慢。 等待了很长时间之后还会报错。 默认第一次编译在线下载 gradle-7.6.1-all.zip 然后解压缩到 C:\Users\Administrator\.gradle 文件夹中,下载慢导致失败。 二…

【网络原理】IP协议详解

一.与IP协议相关的基本概念 IP协议,即网际互连协议(Internet Protocol),是TCP/IP体系中的核心网络层协议。 网络层IP协议解决的问题 数据传输的过程中,不是直接进行的传输,而是经过层层的封装和分用的过程才能到达对端. IP协议主…

初识指针(2)<C语言>

前言 前文介绍完了一些指针基本概念,下面介绍一下,const关键字、指针的运算、野指针的成因以及避免,assert函数等。 目录 const(常属性) 变量的常属性 指针的常属性 指针的运算 ①指针 -整数 ②指针-指针 ③指针与…

不考408的985,不想考408的有福了!吉林大学计算机考研考情分析

吉林大学(Jilin University)简称吉大,位于吉林长春,始建于1946年,是中华人民共和国教育部直属的综合性全国重点大学,国家“双一流”、“211工程”、“985工程”、“2011计划”重点建设的著名学府&#xff0…

控制台调试 hover 后才出现的元素

调试 hover后才出现的元素 打开开发者工具,鼠标放在hover时才出现的元素上,然后点击右键; 不要选中任何选项,将鼠标移动到开发者工具的调试面板中; 按下N键,此时悬浮的元素不会消失,定位成功。…