gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用,gofly框架内置校验工具,提供开发效率,开发接口简单调用即可实现验证,下面介绍gofly框架数据验证设计思路及使用方法。

gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单校验组件,由gvalid组件实现。gvalid组件实现了非常强大的数据校验功能,内置了数十种常用的校验规则,支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验、自定义校验规则注册、支持struct tag规则及提示信息绑定等等特性,是目前功能最强大的Go数据校验模块。

如果想增加或修改验证规则utils/tools/gvalid/internal目录下添加会修改。验证提示多语言数据在resource\locale目录下,例如中文(zh-CN)、英文(en-US)。多语言我们采用前后端同步方式,由前端决定语种,根据前端当前语言在请求时向接口提交当前设置语言参数,这样后端就可以和前端保持同一语言,前后端提示语言同步设置如下图前端:

1.检验规则示例:

Data()传入检验数据,Locale()传入检验提示语言。

Go 复制代码
//验证规则
	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必传并且两个值一致。

Go 复制代码
// 测试入参验证
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传入参数:
javascript 复制代码
{
  account:gf,
  qq:123456,
  password:Gofly23,
  password2:gofly23,
  locale:cn,
}
2.2返回提示:
javascript 复制代码
{
    "code": 1,
    "data": false,
    "exdata": null,
    "message": "password字段值`Gofly23`必须和password2字段值`gofly23`相同; account字段值`gf`字段长度应当为6到16个字符",
    "time": 1708557872337,
    "token": ""
}

方法中校验规则:校验规则使用文档 了解更多。

相关推荐
newerp11 小时前
Go net/http 标准库基础
后端·程序员·go
26519405112648012 小时前
01-整体架构与高可用
go
程序员爱钓鱼14 小时前
Go if 判断详解
前端·后端·go
名字还没想好☜1 天前
Go 的 unsafe.Pointer 实战:零拷贝 []byte↔string 转换与三条铁律
开发语言·后端·golang·go·unsafe
阿里云云原生1 天前
阿里云联合 Datadog,补齐 Go 可观测性最后短板
云原生·go
可观测性用观测云1 天前
零码改造!Go 语言应用上报观测云完整最佳实践
go
斐波那契数列1 天前
参考react 实现一个golang gui
go
程序员爱钓鱼2 天前
Go 运算符详解
后端·面试·go
angryshan2 天前
goLang配置断点流程
go·bug
名字还没想好☜2 天前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go