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": ""
}

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

相关推荐
孔令飞4 小时前
企业智能化升级:智能体平台设计和实现
云原生·go·ai编程
vipxieliang7 小时前
Go GC 性能优化实践:从 GOGC、GOMEMLIMIT 到分配优化
后端·go
小满zs1 天前
Go语言第十八章(架构设计)
后端·go
FungLeo2 天前
成为全栈·Go 后端篇·三轮代码审阅之后:把可读性和证据做成工程规则
golang·go·ast·静态检查·成为全栈·代码审阅
我不会起名字3222 天前
Redis 从 0 到 1(二十八):Redis 抖一下,重试把它打挂了——超时/重试/熔断的 Go 封装
redis·go·超时·熔断·重试
xyzzklk2 天前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓
vipxieliang3 天前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
我不会起名字3224 天前
Redis 从 0 到 1(二十七):JSON 体积是 Protobuf 的 3.7 倍?3 种序列化的 Go 基准测试
redis·go·序列化·protobuf·messagepack
我不会起名字3224 天前
Redis 从 0 到 1(二十三):一个热 key 打到 10 万 QPS——hotkey 与本地缓存的 Go 实现
redis·缓存·go·qps·hotkey
Patrick_Wilson5 天前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言