开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
Gin作为Golang社区的宠儿,目前是关注度最高的web框架,这一切归结于Gin巧妙的设计、方便的可插拔模式、灵活的身躯以及卓越的性能;使用Gin框架写业务逻辑,就仿佛写诗歌般的优雅,沁人心脾。
Github地址:github.com/gin-gonic/g…
Gin官方文档:gin-gonic.com/zh-cn/docs/…
快速上手
介绍如何安装并启动一个Gin服务
安装
使用GoModule初始化项目后,使用go get下载并安装gin
go get -u github.com/gin-gonic/gin
启动
启动Gin服务超级简单,核心来说分为三个步骤:
- 使用
gin.New()或者gin.Default()初始化Engine对象 - 定义监听的地址及其处理的方法
- 使用
r.Run()启动服务,默认监听的是8080端口;Run()方法可通过:8000这种方式传参来修改其监听的端口为8000
// 初始化Engine对象
r := gin.Default()
// 定义路由地址及其处理逻辑
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
// 启动服务
r.Run()
路由
Gin框架为路由的定义,参数的获取提供了多种实现;支持URI、Get、表单、Json等多种样式的传参,同时可以通过相应的Bind方法将传递过来的参数绑定到对应的结构体上,简化了不同类型数据的格式转化。
URI格式传参
针对路由中的参数,使用:name的方式定义,通过c.Param("name")方式获取
// curl http://localhost:8080/ping/get
// response ==> {"name":"get"}
// 定义路由参数 name
r.GET("/ping/:name", func(c *gin.Context) {
c.JSON(200, gin.H{
"name": c.Param("name"), // 获取路由参数name对应的值
})
})
Get格式传参
针对URI后面通过?分割后传递过来的参数,可以使用c.Query()方法来获取
// curl http://localhost:8080/ping?name=get
// response ==> {"name":"get"}
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"name": c.Query("name"), // 获取请求地址中,问号后面传递过来的值
})
})
表单格式传参
通过c.PostForm()方法获取表单传递过来的参数
c.PostForm("name") // 获取表单中name参数对应的值
Json格式传参
核心来说分为两步:
- 定义需要接受参数的结构体
- 使用
c.ShouldBindJSON()方法将传递过来的JSON数据绑定到对应的结构体上
// curl -X POST -H 'Content-Type: application/json' -d '{"name":"get"}' 127.0.0.1:8080/ping
// response ==> {"name":{"name":"get"}}
// 定义 Person 结构体
type Person struct {
Name string `json:"name"`
}
r.POST("/ping", func(c *gin.Context) {
p := new(Person)
// 解析数据到结构体上
c.ShouldBindJSON(p)
c.JSON(200, gin.H{
"name": p,
})
})
中间件
在中间件方面,Gin框架提供了BasicAuth(基础认证)、Recovery(异常捕捉)、Logger(系统日志)等常见的中间件;同时,也支持自定义中间件
框架自带的中间件
通过r.Use()来引入需要使用的中间件,如下所示引入系统日志中间件:
r.Use(gin.Logger())
自定义中间件
比较核心的点为需要定义一个返回类型为gin.HandlerFunc的函数,函数内部通过c.Next()方法表示继续往下执行,当满足条件需要终止执行时可以使用c.About()
// 定义中间件,向页面输出字符串 Hello Middleware
func middleware() gin.HandlerFunc {
return func(c *gin.Context) {
c.String(http.StatusOK, "Hello Middleware")
c.Next()
}
}
// 启用上述定义的中间件
// 这样每次请求时,都会在返回结果的最前面加上字符串 Hello Middleware
r.Use(middleware())
静态资源服务
使用r.Static()或r.StaticFS()方法都能对静态资源提供管理服务,不过针对StaticFS提供了文件系统服务,及就是当访问的地址是文件夹时,会罗列出对应文件夹下的文件列表
// 将请求地址 /static 映射到电脑文件 /var/www 上
r.Static("/static", "/var/www")
返回值类型
Gin框架支持String、Json、XML、ProtoBuf等多种格式的数据返回,使用也比较简单,通过类似于c.String()的这种方式进行返回,参考如下:
c.String(200, "I'm String")