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")
}
本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。