七叶笔记 » golang编程 » 学习笔记-Golang开发之Gin框架

学习笔记-Golang开发之Gin框架

Gin框架

Gin是Go的微框架,封装比较优雅,API友好,源码注释比较明确,版本稳定。具有快速灵活,容错方便等特点。其实对于Go而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错。框架更像是一些常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。

Gin 特性

  • 快速 :路由不使用反射,基于Radix树,内存占用少。
  • 中间件 :HTTP请求,可先经过一系列中间件处理,例如:Logger,Authorization,GZIP等。这个特性和 NodeJs 的 Koa 框架很像。中间件机制也极大地提高了框架的可扩展性。
  • 异常处理 :服务始终可用,不会宕机。Gin 可以捕获 panic,并恢复。而且有极为便利的机制处理HTTP请求过程中发生的错误。
  • JSON :Gin可以解析并验证请求的JSON。这个特性对Restful API的开发尤其有用。
  • 路由分组 :例如将需要授权和不需要授权的API分组,不同版本的API分组。而且分组可嵌套,且性能不受影响。
  • 渲染内置 :原生支持JSON,XML和HTML的渲染。

安装使用

环境要求

要安装Gin包,首先需要安装Go并设置Go工作区,即GOPATH。

gin框架需要Go语言版本在1.6及以上。可以通过go version查看自己的Go语言版本是否符合要求。

1、下载并安装

 go get -u github.com/gin-gonic/gin  

2、代码中导入

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

安装完毕后,可以在当前系统的$GOPATH目录下的src/github.com目录中找到gin-gonic目录,该目录下存放的就是gin框架的源码。

简单示例

 package main
import "github.com/gin-gonic/gin"
func main() 
{
//Default返回一个默认的路由引擎
r := gin.Default()
    r.GET("/ping", func(c *gin.Context) 
{
//输出json结果给调用方
c.JSON(200, gin.H 
{
"message": "pong",
}
)
}
)
r.Run() // 此处不指定端口,则默认8080
//r.Run(":8090")//指定端口为8090
}  

编译运行程序,打开浏览器,访问
页面显示:

 {"message":"pong"}  

RESTful API

关于RESTful API风格前两篇文章已经提到过,此处不过多赘述。(详见学习笔记-RESTful简单理解和学习笔记-RESTful基本规范)

Gin框架支持开发RESTful API的开发。

 func main() {
    r := gin.Default()
    r.GET("/book", func(c *gin.Context) {//查询书籍信息
        c.JSON(200, gin.H{
            "message": "GET",
        })
    })

    r.POST("/book", func(c *gin.Context) {//创建书籍记录
        c.JSON(200, gin.H{
            "message": "POST",
        })
    })

    r.PUT("/book", func(c *gin.Context) {//更新书籍信息
        c.JSON(200, gin.H{
            "message": "PUT",
        })
    })

    r.DELETE("/book", func(c *gin.Context) {//删除书籍信息
        c.JSON(200, gin.H{
            "message": "DELETE",
        })
    })
}  

路由组

我们可以将拥有共同URL前缀的路由划分为一个路由组。

 func main() {
    r := gin.Default()
    userGroup := r.Group("/user")
    {
        userGroup.GET("/index", func(c *gin.Context) {...})
        userGroup.GET("/login", func(c *gin.Context) {...})
        userGroup.POST("/login", func(c *gin.Context) {...})

    }
    bookGroup := r.Group("/book")
    {
        bookGroup.GET("/name", func(c *gin.Context) {...})
        bookGroup.GET("/data", func(c *gin.Context) {...})
        bookGroup.POST("/data", func(c *gin.Context) {...})
    }
    r.Run()
}  

中间件

 func main() {
    // 创建一个不包含中间件的路由器
    r := gin.New()

    // 全局中间件
    // 使用 Logger 中间件
    r.Use(gin.Logger())

    // 使用 Recovery 中间件
    r.Use(gin.Recovery())

    // 路由添加中间件,可以添加任意多个
    r.GET("/benchmark", MyBenchLogger(), benchEndpoint)

    // 路由组中添加中间件
    // authorized := r.Group("/", AuthRequired())
    // exactly the same as:
    authorized := r.Group("/")
    // per group middleware! in this case we use the custom created
    // AuthRequired() middleware just in the "authorized" group.
    authorized.Use(AuthRequired())
    {
        authorized.POST("/login", loginEndpoint)
        authorized.POST("/submit", submitEndpoint)
        authorized.POST("/read", readEndpoint)

        // nested group
        testing := authorized.Group("testing")
        testing.GET("/analytics", analyticsEndpoint)
    }

    // Listen and serve on 0.0.0.0:8080
    r.Run(":8080")
}  

本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。

相关文章