这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记,主要简单介绍一下gin框架的使用,Gin是Go(Golang)编写的Web框架。他是一个类似于martini但拥有更好性能的API框架。
1.绑定结构体
需要在后面添加json、uri和form等字段
type PostParam struct {
Name string `json:"name" uri:"name" form:"name"`
Age int `json:"age" uri:"age" form:"age"`
Sex bool `json:"sex" uri:"sex" form:"sex"`
}
1.1绑定json
r.PUT("/path", func(c *gin.Context) {
var p PostParam
err := c.ShouldBindJSON(&p) //把传入的json数据绑定到p中
if err != nil {
c.JSON(404, gin.H{
"message": "报错啦",
"data": gin.H{},
})
} else {
c.JSON(200, gin.H{
"message": "成功啦",
"name": p.Name,
"age": p.Age,
"sex": p.Sex,
})
}
})
1.2绑定uri
r.PUT("/path/:name/:age/:sex", func(c *gin.Context) {
var p PostParam
err := c.ShouldBindUri(&p) //把传入的json数据绑定到p中
if err != nil {
c.JSON(404, gin.H{
"message": "报错啦",
"data": gin.H{},
})
} else {
c.JSON(200, gin.H{
"message": "成功啦",
"name": p.Name,
"age": p.Age,
"sex": p.Sex,
})
}
})
1.3绑定query
r.PUT("/path/:name/:age/:sex", func(c *gin.Context) {
var p PostParam
err := c.ShouldBindUri(&p) //把传入的json数据绑定到p中
if err != nil {
c.JSON(404, gin.H{
"message": "报错啦",
"data": gin.H{},
})
} else {
c.JSON(200, gin.H{
"message": "成功啦",
"name": p.Name,
"age": p.Age,
"sex": p.Sex,
})
}
})
1.4表单验证
- 使用binding关键字,绑定验证方法(required是该框架自带的,mustBig是自己定义的,指明需要验证的逻辑)
- 实现自己定义的验证方式
- 在main方法中对自定义验证方法进行注册
type PostParam struct {
Name string `json:"name" `
Age int `json:"age" binding:"required,mustBig"`
Sex bool `json:"sex" `
}
func mustBig(f1 validator.FieldLevel) bool {
fmt.Println("ddddddd")
fmt.Println(f1.Field())
if f1.Field().Interface().(int) <= 18 {
return false
}
return true
}
func main() {
r := gin.Default() //启动了gin的路由
//对验证方法进行绑定
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("mustBig", mustBig)
}
}
2.gin的路由分组和中间件
2.1路由分组
可以对路由进行分组,对组进行统一管理,使路由结构更加清晰
func main() {
r := gin.Default() //启动了gin的路由
v1 := r.Group("v1")
v1.GET("test", func(c *gin.Context) {
fmt.Println("我在路由分组内部")
c.JSON(200, gin.H{
"msg": "success",
})
})
r.Run(":1010") // listen and serve on 0.0.0.0:8080
}
2.2中间件
2.2.1中间件的介绍
定义:在请求到达路由的方法的前和后进行一系列操作
使用方式:在路由器(路由组)上进行use操作,后面传入中间函数即可。
Use函数的定义
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes
首先,我们可以通过Gin提供的默认函数,来构建一个自带默认中间件的*Engine
r := gin.Default()
Default函数会默认绑定两个已经准备好的中间件,包括Logger 和 Recovery,帮助我们打印日志输出和panic处理。
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
2.2.2自定义中间件
- 定义一个HandlerFunc 例如定义一个中间件在请求路由方法前后打印一些话
func printSome() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Print("路由方法执行前------")
//请求处理
c.Next()
fmt.Print("路由方法执行后------")
}
}
- 使用自定义中间件
func main() {
r := gin.New()
r.Use(printSome())
r.GET("/", func(c *gin.Context) {
c.JSON(200, "首页")
})
r.Run(":8080")
}