接口传入的参数做相关性质验证是开发中较为常用,gofly框架内置校验工具,提供开发效率,开发接口简单调用即可实现验证,下面介绍gofly框架数据验证设计思路及使用方法。
gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单校验组件,由gvalid组件实现。gvalid组件实现了非常强大的数据校验功能,内置了数十种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验、自定义校验规则注册、支持struct tag规则及提示信息绑定等等特性,是目前功能最强大的Go数据校验模块。
如果想增加或修改验证规则utils/tools/gvalid/internal目录下添加会修改。验证提示多语言数据在resource\locale目录下,例如中文(zh-CN)、英文(en-US)。多语言我们采用前后端同步方式,由前端决定语种,根据前端当前语言在请求时向接口提交当前设置语言参数,这样后端就可以和前端保持同一语言,前后端提示语言同步设置如下图前端:
1.检验规则示例:
Data()传入检验数据,Locale()传入检验提示语言。
//验证规则
type BizReq struct {
Account string `v:"bail|required|length:6,16|same:QQ"`
QQ string
Password string `v:"required|same:Password2"`
Password2 string `v:"required"`
}
var (
req = BizReq{
Account: "gf",
QQ: "123456",
Password: "Gofly23",
Password2: "gofly23",
}
)
if err := gf.Validator().Data(req).Locale("en-US").Run(c); err != nil {
fmt.Println("英文", err)
}
if err := gf.Validator().Data(req).Locale("zh-CN").Run(c); err != nil {
fmt.Println("中文", err)
}
2.接口中对前端传入参数验证并数据入库操作示例:
示例中是对的account验证为(1)必传,(2)长度为6到16之间,(3)传入值的qq参数值一样。password和password2必传并且两个值一致。
// 测试入参验证
func (api *Index) SaveVeriApi(c *gf.GinCtx) {
//获取传参
param, _ := gf.RequestParam(c)
//验证规则
rules := map[string]string{
"account": "bail|required|length:6,16|same:qq",
"password": "required|same:password2",
"password2": "required",
}
if err := gf.Validator().Rules(rules).Data(param).Locale(c.Request.Header.Get("locale")).Run(c); err != nil {
gf.Failed().SetMsg(err.String()).Regin(c)
return
}
res, err := gf.Model("user").Data(param).Save()
if err != nil {
gf.Failed().SetMsg("错误").SetData(err).Regin(c)
} else {
gf.Success().SetMsg("添加成功").SetData(res).SetExdata(param).Regin(c)
}
}
2.1传入参数:
{
account:gf,
qq:123456,
password:Gofly23,
password2:gofly23,
locale:cn,
}
2.2返回提示:
{
"code": 1,
"data": false,
"exdata": null,
"message": "password字段值`Gofly23`必须和password2字段值`gofly23`相同; account字段值`gf`字段长度应当为6到16个字符",
"time": 1708557872337,
"token": ""
}
方法中校验规则:校验规则使用文档 了解更多。