Skip to content

request_validator

ACoderHIT edited this page Aug 15, 2019 · 2 revisions

简介

承接上一节《请求与响应》如果将表单请求后转换成数据结构实体,如果表单有大概20个参数(比如用户注册,或者提交订单等参数较多的请求),那么对每一项参数进行校验是非常耗时耗力的,所以引入validator.v9就是为了简化这样一件事情,通过对数据结构实体的定义,从而达到快速校验数据

目录

app/http/entities app/http/controllers

为什么选用validator.v9

对结构实体后加规则这种方式,比较契合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信息给上一层,同时将被拦截字段信息输出到错误日志

validator.v9的小技巧

required无法判断字段未传值还是传0值 比如status=0,如果传的值就等于0,被拦截掉,显然不符合实际应用 如果要判断值,可以将字段设置为指针类型,指针类型,nil就是nil,而0值就不会被拦截

Clone this wiki locally