使用bind绑定参数和参数验证 | 青训营

100 阅读1分钟

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()函数实现。
    
}