本文目的
本文旨在向大家简单的介绍Gin框架。如需详细了解,可查看个人主页,有成套视频讲解。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 mainimport "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}
编译运行程序,打开浏览器,访问http://localhost:8080/ping页面显示:
{"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")}
本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。如需了解更多,个人主页,有详细成套视频讲解。Gin框架第一讲