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

news2024/11/25 7:37:37

最近需要使用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.go

4 directories, 6 files

这里直接把源码贴出来:

main.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

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

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

package controls

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

$ 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.go

5 directories, 9 files

4. 添加路由

routers/router.go中添加路由:

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

routers/router.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",则会报错:

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:

在这里插入图片描述

可以看到正常的结果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

水库大坝安全监测预警系统解决方案介绍

一、方案背景 随着社会的快速发展,水库大坝作为重要的水利工程设施,承载着防洪、灌溉、发电等多重功能。然而水库大坝的安全问题也日益凸显,一旦发生事故,后果将不堪设想,因此,建立一套高效、准确的水库大…

打印机 ansible配置dhcp和打印机

部署dhcp服务器 主机发送Discover报文 目标为广播地址 同一网段的dhcp收到报文后,dhcp响应一个offer报文 offer报文:dhcp自己的ip地址。和客户端ip以及使用周期,和客户端ip网络参数 最后主机单独发一个request报文 给那个选择的dhcp服务器 &…

电器跌倒检测可以使用什么元器件

电器跌倒检测是智能家居安全的重要组成部分。在智能化发展的今天,倾倒开关成为了电器跌倒检测的核心元器件之一。这种小巧的装置能够及时感知设备的倾倒情况,并启动断电保护功能,从而有效避免可能的危险情况。 倾倒开关具有体积小、安装简易…

智能合约如何开源-全网最详细的文档了没有之一.....

1、首先切换到BSC主网选择登录 登录地址:https://bscscan.com/ 2、进入个人中心创建key 3、进入remix-激活插件 网站:https://remix.ethereum.org/ 4、填写刚刚bsc上申请的key 5、回到remix上进行合约认证 前提:合约源码要和部署的是一致的…

DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进

DigitalOcean 希望可以为企业提供所需的工具和基础设施,以帮助企业客户加速云端的开发,实现业务的指数级增长。为此 DigitalOcean 在 2020 年就推出了App Platform。 App Platform(应用托管) 是一个完全托管的 PaaS 解决方案&…

vue3点击添加小狗图片,vue3拆分脚本

我悄悄蒙上你的眼睛 模板和样式 <template><div class"XueXi_Hooks"><img v-for"(dog, index) in dog1List" :src"dog" :key"index" /><button click"addDog1">点我添加狗1</button><hr …

远程监控供水设备运行状态

随着城市化进程的加快&#xff0c;供水设备的安全稳定运行对于保障居民日常生活和工业生产至关重要。然而&#xff0c;传统的供水设备管理方式往往受限于人力、物力和时间的限制&#xff0c;难以实现对供水设备运行状态的全面监控和实时管理。在这一背景下&#xff0c;HiWoo Cl…

杨校老师项目之基于大数据技术栈hadoop商业web应用的日志分析系统

获取全套资料&#xff1a; 有偿获取&#xff1a;mryang511688 摘要&#xff1a; 互联网世界的先驱者们一致认为大数据将是未来互联网产业&#xff0c;甚至是整个人类各个产业的基础资源&#xff0c;那么到底什么是大数据&#xff0c;大数据给我们的世界是如何带来变化的呢&am…

Python中进程类Process的方法与属性的使用示例

一、示例代码&#xff1a; from multiprocessing import Process import time import osdef child_1(interval):print(子进程&#xff08;%s&#xff09;开始执行&#xff0c;父进程为&#xff08;%s&#xff09; % (os.getpid(), os.getppid()))t_start time.time()time.sle…

Web 安全 PHP 代码审查之常规漏洞

前言 工欲善其事&#xff0c;必先利其器。我们做代码审计之前选好工具也是十分必要的。下面我给大家介绍两款代码审计中比较好用的工具。 一、审计工具介绍 PHP 代码审计系统— RIPS 功能介绍 RIPS 是一款基于 PHP 开发的针对 PHP 代码安全审计的软件。 另外&#xff0c;…

掌握JavaScript,轻松实现自动化测试!

随着软件开发的不断发展&#xff0c;自动化测试在保证软件质量和提高开发效率方面扮演着越来越重要的角色。而在自动化测试过程中&#xff0c;JavaScript作为一种强大的脚本语言&#xff0c;为我们提供了丰富的工具和功能。本文将介绍在自动化测试中&#xff0c;掌握JavaScript…

一致性的艺术:深度剖析Paxos在分布式事务模型中的精妙设计

关注微信公众号 “程序员小胖” 每日技术干货&#xff0c;第一时间送达&#xff01; 引言 在数字化浪潮的推动下&#xff0c;分布式系统已经成为现代IT架构的基石。它们支撑着我们日常使用的在线服务&#xff0c;从电商购物到金融交易&#xff0c;从社交网络到云计算平台。然…

rmallox勒索病毒肆虐,如何保护网络安全?

rmallox勒索病毒与网络安全的关系可以从以下几个方面来阐述&#xff1a; 一、rmallox勒索病毒的特性 rmallox勒索病毒是一种极具破坏性的计算机病毒&#xff0c;它具有多个显著特性&#xff0c;这些特性使得该病毒对网络安全构成了严重威胁。具体来说&#xff0c;rmallox病毒具…

制造业如何挖掘数据价值,附数据分析处理软件推荐

制造业如何挖掘和利用数据价值&#xff1f; 在信息化、智能化高速发展的今天&#xff0c;制造业正迎来一场由数据驱动的深刻变革。数据&#xff0c;作为这场变革的核心驱动力&#xff0c;正被制造业企业深度挖掘和利用&#xff0c;以实现更高效、更智能的生产模式。 制造业在利…

基于Springboot的实习生管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的实习生管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

具身触觉社区| “大咖面对面”第一期活动顺利举行

4月27日&#xff0c;由中国人工智能学会认知系统与信息处理专委会组织的“具身触觉社区”第一期“大咖面对面”分享活动顺利举行&#xff0c;我们邀请到了美国麻省理工学院&#xff08;MIT&#xff09;博士、视触觉传感器的奠基人、GelSight指尖传感器发明人李瑞老师为社区带来…

Linux 第三十章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

CSS学习笔记之中级教程(一)

1、CSS 布局 - display 属性 1.1 display 属性 display 属性是用于控制布局的最重要的 CSS 属性。 display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 …

Hbase基础操作Demo(Java版)

一、前置条件 HBase服务&#xff1a;【快捷部署】023_HBase&#xff08;2.3.6&#xff09;开发环境&#xff1a;Java&#xff08;1.8&#xff09;、Maven&#xff08;3&#xff09;、IDE&#xff08;Idea 或 Eclipse&#xff09; 二、相关代码 代码结构如上图中①和② pom.x…

CNN实现fashion_mnist数据集分类(tensorflow)

1、查看tensorflow版本 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、加载fashion_mnist数据与预处理 import numpy as np (train_images,train_labels),(test_images,test_labels) tf.keras.d…