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

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

相关推荐
第九序言T17 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
龙亘川18 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人18 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas10019 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
专注仿真19 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
jimy120 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
呆呆虫1220 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心疼你的一切21 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
Wang's Blog1 天前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
中科三方1 天前
IPv6检测常见问题:AAAA记录检测不通过是什么原因?
开发语言·php