gin可通过bind来绑定前端传过来的数据
type PostParams struct {
Name string `json:"name" form:"name"`
Age string `json:"age" form:"age"` //query形式的参数用form来表示
}
这里定义了一个结构体,反括号里的值表示不同格式数据所绑定的key:
如 json:“name”表示 如果前端传来一个json数据,那么这个json里key为name的数据就与PostParams结构体里的Name属性绑定。
具体绑定过程如下:
r.POST("/testBind", func(ctx *gin.Context) {
var p1, p2 PostParams
err1 := ctx.ShouldBindJSON(&p1) //注意传入绑定结构体的地址
err2 := ctx.ShouldBindQuery(&p2)
if err1 != nil || err2 != nil {
ctx.JSON(200, gin.H{
"msg": "出错了",
"data": gin.H{},
})
} else {
ctx.JSON(200, gin.H{
"msg": "success",
"data1": p1,
"data2": p2,
})
}
})
试着post数据到服务器:
参数验证
如果在上面的例子中我post一个空json,那么不会报错,返回的也是值为空的结构体
如图,这里query里没有传值
若此时,我给age字段加一个 binding:“required”:
type PostParams struct {
Name string `json:"name" form:"name"`
Age int `json:"age" form:"age" binding:"required,ifadult"`
}
那么如果绑定的 json 中 key 为 age 的值为空则会报错。
自定义验证
上面的代码中,required后面还有一个ifadult,这是一个判断age是否大于18的一个验证。
具体使用方法如下:
import(
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
)
func ifadult(fl validator.FieldLevel) bool {
age := fl.Field().Interface().(int)
return age >= 18
}
func main(){
r := gin.Default()
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("ifadult", ifadult)
} //这里先判断是否实现了接口。
//接着调用了validator.Validate的RegisterValidation()方法。
//添加了一个名为ifadult的验证。这个验证具体由上面定义的ifadult()函数实现。
}