接口传入的参数做相关性质验证是开发中较为常用,gofly框架内置校验工具,提供开发效率,开发接口简单调用即可实现验证,下面介绍gofly框架数据验证设计思路及使用方法。
gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单校验组件,由gvalid组件实现。gvalid组件实现了非常强大的数据校验功能,内置了数十种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验、自定义校验规则注册、支持struct tag规则及提示信息绑定等等特性,是目前功能最强大的Go数据校验模块。
如果想增加或修改验证规则utils/tools/gvalid/internal目录下添加会修改。验证提示多语言数据在resource\locale目录下,例如中文(zh-CN)、英文(en-US)。多语言我们采用前后端同步方式,由前端决定语种,根据前端当前语言在请求时向接口提交当前设置语言参数,这样后端就可以和前端保持同一语言,前后端提示语言同步设置如下图前端:
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)
- }
示例中是对的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)
- }
- }
- {
- account:gf,
- qq:123456,
- password:Gofly23,
- password2:gofly23,
- locale:cn,
- }
- {
- "code": 1,
- "data": false,
- "exdata": null,
- "message": "password字段值`Gofly23`必须和password2字段值`gofly23`相同; account字段值`gf`字段长度应当为6到16个字符",
- "time": 1708557872337,
- "token": ""
- }
方法中校验规则:校验规则使用文档 了解更多。