-
Notifications
You must be signed in to change notification settings - Fork 60
request_validator
ACoderHIT edited this page Aug 15, 2019
·
2 revisions
承接上一节《请求与响应》如果将表单请求后转换成数据结构实体,如果表单有大概20个参数(比如用户注册,或者提交订单等参数较多的请求),那么对每一项参数进行校验是非常耗时耗力的,所以引入validator.v9就是为了简化这样一件事情,通过对数据结构实体的定义,从而达到快速校验数据
app/http/entities app/http/controllers
对结构实体后加规则这种方式,比较契合snow框架的请求与响应 v8和v9其实功能类似,不过对于v8来说有exists选项,而v9统一只用required,统一了规则,而且简洁
type TestValidatorRequest struct {
Id *int64 `json:"id" validate:"required"` //required 必传字段
Age int `json:"age" validate:"required,gte=0,lte=130"` //gte:>= lte:<=
Name *string `json:"name" validate:"required"`
Email string `json:"email" validate:"required,email"` //email规则校验
Url string `json:"url" validate:"required"`
Mobile string `json:"mobile" validate:"required"`
RangeNum int `json:"range_num" validate:"max=10,min=1"` //定义参数允许的最大值和最小值
TestNum *int `json:"test_num" validate:"required,oneof=5 7 9"` //设置参数必须为指定集合中的某个数值
Content *string `json:"content"`
Addresses []*Address `json:"addresses" validate:"required,dive,required"` //支持复杂的复合结构
}
type Address struct {
Street string `json:"street" validate:"required"` //上面Addresses中的参数,如果Street为空,同样会被校验
City string `json:"city" validate:"required"`
Planet string `json:"planet" validate:"required"`
Phone string `json:"phone" validate:"required"`
}
统一在GenRequest(c *gin.Context, request interface{})方法中进行自动校验,如果不符合校验规则会返回err信息给上一层,同时将被拦截字段信息输出到错误日志
required无法判断字段未传值还是传0值 比如status=0,如果传的值就等于0,被拦截掉,显然不符合实际应用 如果要判断值,可以将字段设置为指针类型,指针类型,nil就是nil,而0值就不会被拦截