validator库在gin中的使用
封装语言包翻译器
package validator
import (
"fmt"
"net/http"
"reflect"
"github.com/go-playground/locales/zh_Hans_CN"
unTrans "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhTrans "github.com/go-playground/validator/v10/translations/zh"
)
func Validate(data interface{}) (string, int) {
validate := validator.New()
uni := unTrans.New(zh_Hans_CN.New())
trans, _ := uni.GetTranslator("zh_Hans_CN")
err := zhTrans.RegisterDefaultTranslations(validate, trans)
if err != nil {
fmt.Println("err:", err)
}
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
label := field.Tag.Get("label")
return label
})
err = validate.Struct(data)
if err != nil {
for _, v := range err.(validator.ValidationErrors) {
return v.Translate(trans), http.StatusUnprocessableEntity
}
}
return "", 0
}
tag中设置验证规则
validate:定义验证规则
lable:自定义错误提示
// DealerUserAddress 结构体
type UserAddress struct {
global.GVA_MODEL
Address string `json:"address" form:"address" validate:"required" label:"地址" gorm:"column:address;comment:地址;size:1000;default:'';"` //地址
ContactPerson string `json:"contactPerson" form:"contactPerson" validate:"required" label:"联系人" gorm:"column:contact_person;comment:联系人;size:255;default:'';"` //联系人
Mobile string `json:"mobile" form:"mobile" validate:"required,min=11" label:"手机号" gorm:"column:mobile;comment:手机号;size:12;default:'';"` //手机号
ManuId int `json:"manuId" form:"manuId" gorm:"column:manu_id;comment:经销商ID;"` //经销商ID
Mark string `json:"mark" form:"mark" gorm:"column:mark;comment:注意;size:1000;default:'';"`
global.GVA_DATA_AUTH_MODEL
}
更多验证规则参考手册
https://github.com/go-playground/validator
控制层验
func (userAddressApi *UserAddressApi) CreateDealerUserAddress(c *gin.Context) {
userToken, _, e := common.GetContextDealerUser(c)
if e != nil {
response.FailWithMessage("获取用户信息失败", c)
return
}
var userAddressApi erp.UserAddress
err := c.ShouldBindJSON(&userAddressApi)
if err != nil {
global.GVA_LOG.Error("参数解析失败!", zap.Error(err))
response.FailWithMessage("参数解析失败", c)
return
}
if msg, errCode := validator.Validate(userAddressApi); errCode != 0 {
err := fmt.Errorf("参数验证失败!code:%d msg:%s", errCode, msg)
global.GVA_LOG.Error(err.Error(), zap.Error(err))
response.FailWithMessage(err.Error(), c)
return
}
if err := userAddressService.CreateUserAddress(&userAddressApi, userToken); err != nil {
global.GVA_LOG.Error("创建失败!", zap.Error(err))
response.FailWithMessage("创建失败", c)
} else {
response.OkWithDetailed(userAddressApi, "创建成功", c)
}
}
curl请求
curl --location --request POST 'http://127.0.0.1:8889/dealerClientErp/createDealerClient' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8889' \
--header 'Connection: keep-alive' \
--data-raw '{
"username": "haima1",
"mobile": "",
"clientType": 3,
"mark": "this is test"
}'
返回结果
{
"code": 7,
"data": {},
"msg": "参数验证失败!code:422 msg:手机号为必填字段"
}
参考文章:
https://www.liwenzhou.com/posts/Go/validator-usages/#c-1-0-2
validator库在gin中的使用的更多相关文章
- gin使用validator库参数校验若干实用技巧
validator库参数校验若干实用技巧 本文介绍了使用validator库做参数校验的一些十分实用的使用技巧,包括翻译校验错误提示信息.自定义提示信息的字段名称.自定义校验方法等. validato ...
- validator库参数校验
目录 validator库参数校验若干实用技巧 基本示例 翻译校验错误提示信息 自定义错误提示信息的字段名 自定义结构体校验方法 自定义字段校验方法 自定义翻译方法 validator库参数校验若干实 ...
- 解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题
解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题 在原来项目中导入全志v3相机的 ...
- 解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题
今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏:使用“rename”限定符.虽然只是一个警告,但看着实在不爽,更重要的是,警告 ...
- libiconv字符集转换库在C#中的使用
<libiconv字符集转换库用法>一文中说到了libiconv能够实现不同字符集的转换. 比方GBK转BIG5等.在项目中由于须要,找到这个库.但是这个库在C#中没有非常好的支持.只是, ...
- 转:CURL库在程序中的运用浅析
CURL库在程序中的运用浅析-nk_ysg-ChinaUnix博客 http://blog.chinaunix.net/uid-22476414-id-3286638.html 这个目录的文章转载fr ...
- Python图像处理库:PIL中Image,ImageDraw等基本模块介绍
Python图像处理库:PIL中Image,ImageDraw等基本模块介绍 标签: 图像处理PILPYTHON 2016-08-19 10:58 461人阅读 评论(0) 收藏 举报 分类: 其他 ...
- Go之Zap日志库集成Gin
简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...
- gin中模型的绑定和验证
要将请求体绑定到结构体中,使用模型绑定. Gin目前支持JSON.XML.YAML和标准表单值的绑定(foo=bar&boo=baz). Gin使用 go-playground/validat ...
- 使用POSIX正则库匹配一行中多个结果
正则匹配与正则表达式是什么东西我就不说了,在这里说下POSIX这个c语言正则库在对字符串进行正则匹配时取出多个结果的问题. 首先简单说明下POSIX正则库的几个函数和使用方法 第一个函数:int re ...
随机推荐
- OREPA:阿里提出训练也很快的重参数策略,内存减半,速度加倍 | CVPR 2022
论文提出了在线重参数方法OREPA,在训练阶段就能将复杂的结构重参数为单卷积层,从而降低大量训练的耗时.为了实现这一目标,论文用线性缩放层代替了训练时的BN层,保持了优化方向的多样性和特征表达能力.从 ...
- #威佐夫博弈#洛谷 2252 [SHOI2002]取石子游戏
题目 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子. 游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子: 二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完 ...
- C++ 编程入门指南:深入了解 C++ 语言及其应用领域
C++ 简介 什么是 C++? C++ 是一种跨平台的编程语言,可用于创建高性能应用程序. C++ 是由 Bjarne Stroustrup 开发的,作为 C 语言的扩展. C++ 为程序员提供了对系 ...
- SpringBoot使用@Value注入静态属性
说明:SpringBoot中使用yml文件配置自定义属性,读取配置文件属性注入到实体类中,属性值都为静态属性 配置文件:yml #用户信息 userMag: userName: "王小波&q ...
- Windows 杀毒简单有效的方式
Windows 电脑杀毒通常会选择杀毒软件,这样太笨重,且容易占内存和存在流氓软件侵入. 推荐使用 Windows 自带的恶意软件删除工具 按住 Win + R 键,弹出运行窗口,输入 mrt. 系统 ...
- 【Insights直播】华为帐号服务,打造全场景安全帐号体系
在App运营过程中,如何保持用户增长和提升用户体验始终是开发者关注的问题,而作为用户使用体验感知的第一环节--帐号注册登录环节是不可忽视,且有很大提升空间的.如何提升帐号的注册登录体验?如何保证用户在 ...
- C++调用Python-5:调用Python函数,传参数字+字符串
# mytest.py def myjoin(a, b): print("num a + str b") return f"{a}=={b}" #include ...
- Qt 操作注册表
一.写入注册表 #include <QSettings> //实例 QSettings //参数 1:注册表位置 //参数 2:操作 windows 注册表 QSettings::Nati ...
- Drop 、Delete、Truncate的区别是什么
Drop .Delete.Truncate 的区别是什么? DROP 删除表结构和数据,truncate 和 delete 只删除数据 truncate 操作,表和索引所占用的空间会恢复到初始大小:d ...
- labelme转coco数据集
原始labelme数据目录结构如下: |-- images | |--- 1.jpg | |--- 1.json | |--- 2.jpg | |--- 2.json | |--- ....... | ...