结构体验证
使用gin框架的数据校验,可以不用解析数据,简少代码量。
package main
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
type Person struct {
Age int `form:"age" binding:"required,gt=10"`
Name string `form:"name" binding:"required"`
Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc
}
func main() {
r := gin.Default()
r.GET("/text", func(c *gin.Context) {
var person Person
if err := c.ShouldBind(&persion); err != nil {
c.String(500, fmt.Sprint(err))
return
}
c.String(200, fmt.Sprint("%#", person))
})
r.Run()
}
自定义校验
package main
import (
"net/http"
"reflect"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"gopkg.in/go-playground/validator.v8"
)
type Person struct {
Age int `form:"age" binding:"required,gt=10"`
Name string `form:"name" binding:"NotNullAndAdmin"`
Address string `form:"address" binding:"required"`
}
// 自定义校验方法
func nameNotNullAndAdmin(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
if value, ok := field.Interface().(string); ok {
// 字段不能为空,并且不等于 admin
return value != "" && !("5lmh" == value)
}
return true
}
func main() {
r := gin.Default()
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("NotNullAndAdmin", nameNotNullAndAdmin)
}
r.GET("/test", func(c *gin.Context) {
var person Person
if err := c.ShouldBind(&person); err == nil {
c.String(200, "%v", person)
} else {
c.String(500, "person bind err:%v", err.Error())
}
})
r.Run()
}