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

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

一、创建项目

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

bash 复制代码
$ mkdir api
$ cd api
$ go mod init api
$ go mod tidy

二、添加代码

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

bash 复制代码
$ tree
.
├── controls
│   └── user.go
├── go.mod
├── go.sum
├── main.go
├── models
│   └── user.go
└── routers
    └── router.go

4 directories, 6 files

这里直接把源码贴出来:

main.go

go 复制代码
package main

import (
	"api/routers"

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

func main() {
	r := gin.Default()
	routers.InitRouters(r)
	r.Run(":8080")
}

routers/router.go

go 复制代码
package routers

import (
	"api/controls"

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

func InitRouters(r *gin.Engine) {
	r.Group("v1").GET("users", controls.GetAllUsers)
}

models/user.go

go 复制代码
package models

var (
	UserList map[string]*User
)

type User struct {
	Id       string
	Username string
	Password string
	Profile  Profile
}

type Profile struct {
	Gender  string
	Age     int
	Address string
	Email   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

go 复制代码
package controls

import (
	"api/models"
	"net/http"

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

func GetAllUsers(c *gin.Context) {
	c.JSON(http.StatusOK, models.GetAllUsers())
}

添加好代码后,执行:

bash 复制代码
$ go mod tidy

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

就可以看到结果了。

三、自动化文档

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

1. 安装最新swag

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

bash 复制代码
go install github.com/swaggo/swag/cmd/swag@latest

2. 编写swag注释

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

go 复制代码
package controls

import (
	"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命令生成文档:

bash 复制代码
$ 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目录,所有生成的文件都放在里面。

bash 复制代码
$ tree
.
├── controls
│   └── user.go
├── docs
│   ├── docs.go
│   ├── swagger.json
│   └── swagger.yaml
├── go.mod
├── go.sum
├── main.go
├── models
│   └── user.go
└── routers
    └── router.go

5 directories, 9 files

4. 添加路由

routers/router.go中添加路由:

bash 复制代码
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

routers/router.go完整代码:

go 复制代码
package routers

import (
	"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",则会报错:

bash 复制代码
go: finding module for package github.com/swaggo/gin-swagger/swaggerFiles
go: api/routers imports
        github.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:

可以看到正常的结果。

相关推荐
程序猿000001号5 小时前
Selenium 深度解析:自动化浏览器操作的利器
selenium·测试工具·自动化
yaosheng_VALVE10 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
Heaven64513 小时前
6.8 Newman自动化运行Postman测试集
软件测试·自动化·接口测试·postman·newman
rpa_top13 小时前
RPA 助力电商:自动化商品信息上传,节省人力资源 —— 以影刀 RPA 为例【rpa.top】
大数据·前端·人工智能·自动化·rpa
新时代农民工--小明13 小时前
前端自动化部署更新,自动化打包部署
运维·前端·自动化
桃园码工16 小时前
2-Gin 框架中的路由 --[Gin 框架入门精讲与实战案例]
gin·路由·实战案例
海绵波波10716 小时前
Gin-vue-admin(2):项目初始化
vue.js·golang·gin
海绵波波10716 小时前
Gin-vue-admin(4):项目创建前端一级页面和二级页面
前端·vue.js·gin
运维&陈同学20 小时前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
云起无垠1 天前
【论文速读】| FirmRCA:面向 ARM 嵌入式固件的后模糊测试分析,并实现高效的基于事件的故障定位
人工智能·自动化