本文作者:杰哥的技术杂货铺[1]
参考文档:
- Gin 框架介绍及使用:https://www.tianyuan.fun/posts/golang/go-use-of-gin-framework.html
一、Gin 框架介绍
Gin 是一个用 Go 语言编写的 web 微框架,封装比较优雅,API 友好,具有快速灵活,容错方便等特点。它是一个类似于 martini 但拥有更好性能的 API 框架,由于使用了 httpprouter,速度提高了近 40 倍。如果你是性能和高效的追求者,你会爱上 Gin。
Go 世界里最流行的 Web 框架,Github[2] 上有 46k star。基于 httprouter 开发的 Web 框架。中文文档[3]齐全,简单易用的轻量级框架。
二、Gin 安装
- 下载并安装 gin:
go get -u github.com/gin-gonic/gin
- 将 gin 引入到代码中:
import "github.com/gin-gonic/gin"
三、Gin 使用
代码语言:javascript复制package api
import (
"github.com/gin-gonic/gin"
)
func RouterStart() {
// 创建一个路由引擎
router := gin.New()
// 创建一个默认的路由引擎
router := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
// gin.Context封装了Request和Response
r.GET("/hello", func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
r.Run()
}
3.1 设置 gin 模式
代码语言:javascript复制gin.SetMode(gin.ReleaseMode)
查看 gin 源码,可发现 gin 框架提供了下列三种模式。
代码语言:javascript复制const (
// DebugMode indicates gin mode is debug.
DebugMode = "debug"
// ReleaseMode indicates gin mode is release.
ReleaseMode = "release"
// TestMode indicates gin mode is test.
TestMode = "test"
)
我们每次启动 gin 框架,如果不设置以下 gin 模式
代码语言:javascript复制gin.SetMode(gin.ReleaseMode)
程序则会输出一段提示
代码语言:javascript复制[WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
所以,现在我们就可以明白了,这三种 mode 分别对应了不同的场景。在我们开发调试过程中,使用 debug 模式就可以了。在上线的时候,一定要选择 release 模式。而 test 可以用在测试场景中。
3.2 创建新路由
代码语言:javascript复制//创建一个路由引擎
router := gin.New()
// 创建一个默认的路由引擎
router := gin.Default()
gin.Default() 和 gin.New() 的区别在于 gin.Default() 也使用 gin.New() 创建 engine 实例,但是会默认使用 Logger 和 Recovery 中间件。
- Logger 是负责进行打印并输出日志的中间件,方便开发者进行程序调试;
- Recovery 中间件的作用是如果程序执行过程中遇到 panic 中断了服务,则 Recovery 会恢复程序执行,并返回服务器 500 内部错误。通常情况下,我们使用默认的 gin.Default() 创建 router 实例。
3.3 创建多路由分组
代码语言:javascript复制chain := router.Group("/api/admin")
我们把一个模块相关的方法都写在一个路由下。便于管理和查找相关的代码。Gin 框架正好为我们提供了这个方法。
代码举例如下
代码语言:javascript复制//v1组路由
v1:=router.Group("/v1")
{
v1.GET("/login", loginEndpoint)
v1.GET("/submit", submitEndpoint)
v1.GET("/read", readEndpoint)
}
//v2组路由
v2:=router.Group("/v2")
{
v2.GET("/login", loginEndpoint)
v2.GET("/submit", submitEndpoint)
v2.GET("/read", readEndpoint)
}
3.4 创建路由
代码语言:javascript复制// 新增banner
chain.POST("/banner/add", handler.AddBanner)
- POST:请求方式;另外例如 GET
- /banner/add:请求的二级路径
- handler.AddBanner:执行函数
当客户端以 POST 方法请求.../banner/add 路径时,会执行后面的函数
3.5 编写接口执行函数
代码语言:javascript复制func AddBanner(ctx *gin.Context)
- gin.Context 封装了 Request 和 Response
Web 服务器收到客户端的 http 请求,会针对每一次请求,分别创建一个用于代表请求的 request 对象、和代表响应的 response 对象。
故:当需要获取客户机提交过来的数据时,找 request 对象就行了。当需要向客户机输出数据,找 response 对象。
3.6 启动服务
代码语言:javascript复制router.Run(config.Conf.Console.Port)
- 启动 HTTP 服务,从配置文件中获取当前服务启动的端口
默认在 0.0.0.0:8080 启动服务
本系列文章:
从零开发区块链应用(一)--golang 配置文件管理工具 viper[4]
从零开发区块链应用(二)--mysql 安装及数据库表的安装创建[5]
从零开发区块链应用(三)--mysql 初始化及 gorm 框架使用[6]
从零开发区块链应用(四)--自定义业务错误信息[7]
从零开发区块链应用(五)--golang 网络请求[8]
从零开发区块链应用(六)--gin 框架使用[9]
从零开发区块链应用(七)--gin 框架参数获取[10]
从零开发区块链应用(八)--结构体初识[11]
从零开发区块链应用(九)--区块链结构体创建[12]
从零开发区块链应用(十)--golang 协程使用[13]
从零开发区块链应用(十一)--以太坊地址生成[14]
参考资料
[1]
杰哥的技术杂货铺: https://learnblockchain.cn/people/3835
[2]
Github: https://github.com/gin-gonic/gin
[3]
中文文档: https://gin-gonic.com/zh-cn/docs/
[4]
从零开发区块链应用(一)--golang配置文件管理工具viper: https://learnblockchain.cn/article/3446
[5]
从零开发区块链应用(二)--mysql安装及数据库表的安装创建: https://learnblockchain.cn/article/3447
[6]
从零开发区块链应用(三)--mysql初始化及gorm框架使用: https://learnblockchain.cn/article/3448
[7]
从零开发区块链应用(四)--自定义业务错误信息: https://learnblockchain.cn/article/3449
[8]
从零开发区块链应用(五)--golang网络请求: https://learnblockchain.cn/article/3457
[9]
从零开发区块链应用(六)--gin框架使用: https://learnblockchain.cn/article/3480
[10]
从零开发区块链应用(七)--gin框架参数获取: https://learnblockchain.cn/article/3481
[11]
从零开发区块链应用(八)--结构体初识: https://learnblockchain.cn/article/3482
[12]
从零开发区块链应用(九)--区块链结构体创建: https://learnblockchain.cn/article/3483
[13]
从零开发区块链应用(十)--golang协程使用: https://learnblockchain.cn/article/3484
[14]
从零开发区块链应用(十一)--以太坊地址生成: https://learnblockchain.cn/article/3485