gin表单验证struct tag

本文是对 validate tag not working in ShouldBindWith 的回答。

有人提了这么一个问题:

golang 复制代码
package main

import (
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
)

// MyStruct ..
type MyStruct struct {
	Order string `form:"order,default=DESC" validate:"omitempty,oneof=ASC DESC"`
}

func startPage(c *gin.Context) {
	var person MyStruct
	if c.ShouldBindWith(&person, binding.Query) == nil {
		log.Println("====== Only Bind By Query String ======")
		log.Println(person.Order)
		c.String(http.StatusOK, "Success")
		return
		// log.Println(person.Address)
	}
	c.String(http.StatusBadRequest, "Failed")
	return
}

func main() {

	route := gin.Default()
	route.Any("/testing", startPage)
	route.Run(":8085")
}

然后表单验证的时候,明明 Order 传递了一个不符合 oneof=ASC DESC 的值,但却验证通过了。

原因

虽然 gin 使用了 go-playground/validator 来作为表单验证的组件,但是在 gin 里面却修改了 struct 验证的 tagname,我们可以看看 default_validator.go#L95

golang 复制代码
func (v *defaultValidator) lazyinit() {
	v.once.Do(func() {
		v.validate = validator.New()
		v.validate.SetTagName("binding")
	})
}

然后,我们就不能通过给 struct 加上 vaidate 的 tag 来写上我们的验证规则,取而代之的是,需要将我们的验证规则写在 binding 这个 tag 里面:

validate:"omitempty,oneof=ASC DESC" 替换成 binding:"omitempty,oneof=ASC DESC",我们即可实现在 gin 中使用 validator 验证我们的 struct。

golang 复制代码
type MyStruct struct {
	Order string `form:"order,default=DESC" binding:"omitempty,oneof=ASC DESC"`
}

参考官方文档:
模型绑定和验证

相关推荐
京师20万禁军教头9 分钟前
39面向对象(高级)-设计模式
java·开发语言·设计模式
白山编程大哥40 分钟前
Java 迭代器接口详解:从 Iterator 到 ListIterator 的完整指南
java·开发语言·windows
见叶之秋44 分钟前
【C++】String类的使用(含模拟实现)
java·开发语言·c++
想吃火锅10051 小时前
【leetcode】42.接雨水js
开发语言·javascript·ecmascript
雪芽蓝域zzs2 小时前
第十六节:递归组件实现无限层级折叠侧边栏菜单
开发语言·javascript·ecmascript
Casbin开源社区2 小时前
一个面板管住 29 个 AI 编程 Agent:Casbin Gateway 的配置统一、协议互转、用量统计与权限管控
人工智能·golang·开源·gateway·casbin
神明不懂浪漫2 小时前
【第二章】库、表、增删改查操作
开发语言·数据库·经验分享·笔记
传奇开心果编程2 小时前
【Rust入门知识点学与练】第11课:HashMap 键值对集合
开发语言·学习·rust
yume_sibai3 小时前
03-Rust 函数式编程特性(闭包 + Iterator + Option/Result + 链式调用)
开发语言·后端·rust
奈斯先生Vector3 小时前
AIGC 视频生成实战:用 Kling Video 拆解文生视频、图生视频与完整工作流
开发语言·人工智能·windows·python·aigc·音视频