gin框架实战(一)- HTTP请求参数校验之神器validator

1 快速安装

使用之前,首先要获取validator这个库:

$ go get github.com/go-playground/validator/v10

2 功能

golang http 请求参数校验工具,具备复杂参数校验规则。

3 操作符

标记

标记说明

,

多操作符分割

|

或操作

-

跳过字段验证

4 常用标记说明 

标记

标记说明

required

必填

Field或Struct validate:"required"

omitempty

空时忽略

Field或Struct validate:"omitempty"

len

长度

Field validate:"len=0"

eq

等于

Field validate:"eq=0"

gt

大于

Field validate:"gt=0"

gte

大于等于

Field validate:"gte=0"

lt

小于

Field validate:"lt=0"

lte

小于等于

Field validate:"lte=0"

eqfield

同一结构体字段相等

Field validate:"eqfield=Field2"

nefield

同一结构体字段不相等

Field validate:"nefield=Field2"

gtfield

大于同一结构体字段

Field validate:"gtfield=Field2"

gtefield

大于等于同一结构体字段

Field validate:"gtefield=Field2"

ltfield

小于同一结构体字段

Field validate:"ltfield=Field2"

ltefield

小于等于同一结构体字段

Field validate:"ltefield=Field2"

eqcsfield

跨不同结构体字段相等

Struct1.Field validate:"eqcsfield=Struct2.Field2"

necsfield

跨不同结构体字段不相等

Struct1.Field validate:"necsfield=Struct2.Field2"

gtcsfield

大于跨不同结构体字段

Struct1.Field validate:"gtcsfield=Struct2.Field2"

gtecsfield

大于等于跨不同结构体字段

Struct1.Field validate:"gtecsfield=Struct2.Field2"

ltcsfield

小于跨不同结构体字段

Struct1.Field validate:"ltcsfield=Struct2.Field2"

ltecsfield

小于等于跨不同结构体字段

Struct1.Field validate:"ltecsfield=Struct2.Field2"

min

最大值

Field validate:"min=1"

max

最小值

Field validate:"max=2"

structonly

仅验证结构体,不验证任何结构体字段

Struct validate:"structonly"

nostructlevel

不运行任何结构级别的验证

Struct validate:"nostructlevel"

dive

向下延伸验证,多层向下需要多个dive标记

[][]string validate:"gt=0,dive,len=1,dive,required"

dive Keys & EndKeys

与dive同时使用,用于对map对象的键的和值的验证,keys为键,endkeys为值

map[string]string validate:"gt=0,dive,keys,eq=1|eq=2,endkeys,required"

required_with

其他字段其中一个不为空且当前字段不为空

Field validate:"required_with=Field1 Field2"

required_with_all

其他所有字段不为空且当前字段不为空

Field validate:"required_with_all=Field1 Field2"

required_without

其他字段其中一个为空且当前字段不为空

Field `validate:"required_without=Field1 Field2"

required_without_all

其他所有字段为空且当前字段不为空

Field validate:"required_without_all=Field1 Field2"

isdefault

是默认值

Field validate:"isdefault=0"

oneof

其中之一

Field validate:"oneof=5 7 9"

containsfield

字段包含另一个字段

Field validate:"containsfield=Field2"

excludesfield

字段不包含另一个字段

Field validate:"excludesfield=Field2"

unique

是否唯一,通常用于切片或结构体

Field validate:"unique"

alphanum

字符串值是否只包含 ASCII 字母数字字符

Field validate:"alphanum"

alphaunicode

字符串值是否只包含 unicode 字符

Field validate:"alphaunicode"

alphanumunicode

字符串值是否只包含 unicode 字母数字字符

Field validate:"alphanumunicode"

numeric

字符串值是否包含基本的数值

Field validate:"numeric"

hexadecimal

字符串值是否包含有效的十六进制

Field validate:"hexadecimal"

hexcolor

字符串值是否包含有效的十六进制颜色

Field validate:"hexcolor"

lowercase

符串值是否只包含小写字符

Field validate:"lowercase"

uppercase

符串值是否只包含大写字符

Field validate:"uppercase"

email

字符串值包含一个有效的电子邮件

Field validate:"email"

json

字符串值是否为有效的 JSON

Field validate:"json"

file

符串值是否包含有效的文件路径,以及该文件是否存在于计算机上

Field validate:"file"

url

符串值是否包含有效的 url

Field validate:"url"

uri

符串值是否包含有效的 uri

Field validate:"uri"

base64

字符串值是否包含有效的 base64值

Field validate:"base64"

contains

字符串值包含子字符串值

Field validate:"contains=@"

containsany

字符串值包含子字符串值中的任何字符

Field validate:"containsany=abc"

containsrune

字符串值包含提供的特殊符号值

Field validate:"containsrune=☢"

excludes

字符串值不包含子字符串值

Field validate:"excludes=@"

excludesall

字符串值不包含任何子字符串值

Field validate:"excludesall=abc"

excludesrune

字符串值不包含提供的特殊符号值

Field validate:"containsrune=☢"

startswith

字符串以提供的字符串值开始

Field validate:"startswith=abc"

endswith

字符串以提供的字符串值结束

Field validate:"endswith=abc"

ip

字符串值是否包含有效的 IP 地址

Field validate:"ip"

ipv4

字符串值是否包含有效的 ipv4地址

Field validate:"ipv4"

datetime

字符串值是否包含有效的 日期

Field validate:"datetime"

5 注意事项

  • 当搜索条件与特殊标记冲突时,如:逗号(,),或操作(|),中横线(-)等则需要使用 UTF-8十六进制表示形式
type Test struct { Field1 string `validate:"excludesall=|"` // 错误 Field2 string `validate:"excludesall=0x7C"` // 正确. 
}
  • 可通过validationErrors := errs.(validator.ValidationErrors)获取错误对象自定义返回响应错误
  • 自定义校验结果翻译
// 初始化翻译器
func validateInit() {zh_ch := zh.New()uni := ut.New(zh_ch)               // 万能翻译器,保存所有的语言环境和翻译数据Trans, _ = uni.GetTranslator("zh") // 翻译器Validate = validator.New()_ = zh_translations.RegisterDefaultTranslations(Validate, Trans)// 添加额外翻译_ = Validate.RegisterTranslation("required_without", Trans, func(ut ut.Translator) error {return ut.Add("required_without", "{0} 为必填字段!", true)}, func(ut ut.Translator, fe validator.FieldError) string {t, _ := ut.T("required_without", fe.Field())return t})
}

6 案例

6.1 HTTP案例

6.1.1 代码

package mainimport ("fmt""net/http""github.com/gin-gonic/gin"
)type RegisterRequest struct {Username string `json:"username" binding:"required"`Nickname string `json:"nickname" binding:"required"`Email    string `json:"email" binding:"required,email"`Password string `json:"password" binding:"required"`Age      uint8  `json:"age" binding:"gte=1,lte=120"`
}func main() {router := gin.Default()router.POST("register", Register)router.Run(":9999")
}func Register(c *gin.Context) {var r RegisterRequesterr := c.ShouldBindJSON(&r)if err != nil {fmt.Println("register failed")c.JSON(http.StatusOK, gin.H{"msg": err.Error()})return}//验证 存储操作省略.....fmt.Println("register success")c.JSON(http.StatusOK, "successful")
}

6.1.2 测试

curl --location --request POST 'http://localhost:9999/register' \
--header 'Content-Type: application/json' \
--data-raw '{"username": "asong","nickname": "golang梦工厂","email": "7418.com","password": "123","age": 140
}'

6.1.3 返回结果

{"msg": "Key: 'RegisterRequest.Email' Error:Field validation for 'Email' failed on the 'email' tag\nKey: 'RegisterRequest.Age' Error:Field validation for 'Age' failed on the 'lte' tag"
}

看这个输出结果,可以看到validator的检验生效了,email字段不是一个合法邮箱,age字段超过了最大限制。

6.2 普通校验

package main
import ("fmt""github.com/go-playground/validator/v10"
)
// 实例化验证对象
var validate = validator.New()
func main() {// 结构体验证type Inner struct {String string `validate:"contains=111"`}inner := &Inner{String: "11@"}errs := validate.Struct(inner)if errs != nil {fmt.Println(errs.Error())}// 变量验证m := map[string]string{"": "", "val3": "val3"}errs = validate.Var(m, "required,dive,keys,required,endkeys,required")if errs != nil {fmt.Println(errs.Error())}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重新定义出行,PIX移动空间-Robobus2.0正式发布

PIX从创始之初就以重塑城市作为愿景,基于对未来终局的思考,我们重新定义了下一代汽车–移动空间,汽车不再只是一个交通工具,而是一个个提供服务的移动空间,这也将最终重塑城市,使城市成为一个真正的超级有机…

正定矩阵在格密码中的应用(知识铺垫)

目录 一. 写在前面 二. 最小值点 三. 二次型结构 四. 正定与非正定讨论 4.1 对参数a的要求 4.2 对参数c的要求 4.3 对参数b的要求 五. 最小值,最大值与奇异值 5.1 正定型(positive definite) 5.2 负定型(negative defin…

【MySQL】字符集与排序规则

在MySQL数据库中,字符集(Character Set)和排序规则(Collation,也称字符集校验规则)是重要的概念,它们对于正确存储和比较数据至关重要。 字符集与排序规则 字符集是一组字符的集合,与数字编码…

8个流行的Python可视化工具包,你喜欢哪个?

用 Python 创建图形的方法有很多,但是哪种方法是最好的呢?当我们做可视化之前,要先明确一些关于图像目标的问题:你是想初步了解数据的分布情况?想展示时给人们留下深刻印象?也许你想给某人展示一个内在的形…

PostgreSQL从入门到精通 - 第40讲:数据库不完全恢复

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第40讲&#…

几种Go语言开发的IDE

Go语言(或Golang)是一种高效的编程语言,它支持并发机制和强大的标准库。由于其日益增长的流行,现在有许多IDE(集成开发环境)支持Go语言开发。这些IDE提供了代码高亮、智能代码补全、调试工具、版本控制集成…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-4 拉普拉斯变换(Laplace)传递函数、微分方程

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-4 拉普拉斯变换(Laplace)传递函数、微分方程 1. Laplace Transform 拉式变换2. 收敛域(ROC)与逆变换(ILT&…

ffmpeg转码新技能

ffmpeg转码新技能 mp3转wavmp4转gif mp3转wav 今天发现之前用ffmpeg转码不好使了。今天发现一个ffmpeg转码新的用法非常简单 ffmpeg -i 0104.mp3 -f wav 0104.wav mp4转gif 同学求助将mp4转gif。我先用剪影把mp4的多余黑边去除。然后用ffmpeg将mp4转出了gif ffmpeg -i shu…

谷歌推出了一种名为提示扩展(Prompt Expansion)的创新框架,旨在帮助用户更轻松地创造出既高质量又多样化的图像。

谷歌推出了一种名为提示扩展(Prompt Expansion)的创新框架,旨在帮助用户更轻松地创造出既高质量又多样化的图像。 论文标题: Prompt Expansion for Adaptive Text-to-Image Generation 论文链接: https://arxiv.org/pdf/2312.16720.pdf 问…

拿到年终奖后马上辞职,厚道吗?

拿到年终奖后马上辞职,厚道吗? 作为一个人,你首先要对自己负责,其次是对自己身边的人(妻儿,家人,朋友)负责。 你明明可以跳槽到有更好的职业发展你不去,是为不智&#…

【普中开发板】基于51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

基于普中开发板51单片机的篮球计分器液晶LCD1602显示 1.主要功能:讲解视频:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接(可点击): 基于51单片机的篮球计分器液晶LCD1602显示 ( pr…

tmux 最新版的编译安装

在官网下载最新的源码 Releases tmux/tmux # 安装编译前置依赖包 sudo apt install ncurses-dev libevent-dev wget https://github.com/tmux/tmux/releases/download/3.3a/tmux-3.3a.tar.gz tar -xf tmux-3.3a.tar.gz cd tmux-3.3a ./configure --enable-static # 采用静…

AspectJ入门(二)— 应用

AspectJ便于调试、测试和性能调整工作。定义的行为范围从简单的跟踪到分析,再到应用程序内部一致性到测试。AspectJ可以干净地模块化这类功能,从而可以在需要时轻松地启用和禁用这些功能。 1 基础 本节将继续介绍AspectJ到一些基础功能,为后…

水稻潜在产量估算解决方案

1.背景与技术路线 统计资料表明,尽管我国粮食单产已由 50 年代初期的 1.2t/ha 增加到如今的 5.2t/h,粮食产量增加了 4 倍,但我国人口的增长速度与气候变化导致的农业生产的不确定性, 在水稻收获指数保持稳定的情况下,…

drf知识--10

接口文档 # 后端把接口写好后: 登录接口:/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接,对接第一个东西就是这个接口文档,前端照着接口文档开发 公司3个人&#xff…

Nginx 的SSL证书配置

目录 1.申请域名,证书下载 2.准备站点源代码 3.修改nginx 对应网站的配置文件 4.修改 host 文件 http协议访问的网站默认会显示不安全,因为数据默认是明文传输的 https是httpssl,ssl是加密协议,通过证书来进行加密的&#xff…

pod进阶:

pod进阶: 探针* poststart prestop pod的生命周期:pod的状态 k8s的重启策略 Always deployment的yaml文件只能是Always pod的yaml三种模式都可以。不论正常退场还是非正常退出都重启 OnFailure:只有状态码非0才会重启,正常退出是不重启的 Never: 正常退出和…

UG装配-引用集

引用集是控制组件的图素在装配体中显示与隐藏 装配体体环境控制组件显示与隐藏的四种方式 1、图层 2、引用集 3、隐藏命令 Ctrl B 4、抑制,取消此组件装配,但保留操作在导航器方便启用 引用集有两种类型 1、UG自动创建的引用集 2、用户定义的引…

Java 泛型深入解析

Java 中的泛型是一种强大的编程特性,允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面,包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先,让我们看一个简单的泛型类的例子。在下面的代码中&a…

Spring中的ApplicationContext和BeanFactory的区别??

ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。 UserServiceImpl: package com.by.service;import com.by.dao.UserDao;/*** 业务层实现类*/ public class UserServiceImpl implements UserService {private UserDao user…