Golang Web 框架 Gin

394 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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服务超级简单,核心来说分为三个步骤:

  1. 使用gin.New()或者gin.Default()初始化Engine对象
  2. 定义监听的地址及其处理的方法
  3. 使用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格式传参

核心来说分为两步:

  1. 定义需要接受参数的结构体
  2. 使用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")