validator库在gin中的使用

validator,gin · 浏览次数 : 5

小编点评

```go import ( "fmt" "net/http" "reflect" "github.com/go-playground/locales/zh_Hans_CN" "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" "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") terr := zhTrans.RegisterDefaultTranslations(validate, trans) if err != nil { fmt.Println("err:", err) return "", 0 } validate.RegisterTagNameFunc(func(field reflect.StructField) string { label := field.Tag.Get("label") return label }) if err := validate.Struct(data); err != nil { for _, v := range err.(validator.ValidationErrors) { return v.Translate(trans), http.StatusUnprocessableEntity } } return "", 0 } ``` **使用说明:** 1. 将此代码复制到 Go 语言中。 2. 修改 `curl请求` 中的 URL 和端口,以匹配您的服务器地址。 3. 运行代码并查看服务器返回的响应。 4. 响应中将包含以下字段: - `code`: 7,表示参数验证失败 - `data`: 空数据 - `msg`: "手机号为必填字段" **注意:** - 此代码使用 `validator.Validate()` 对数据进行验证。 - 验证规则可以自定义通过 `RegisterTagNameFunc()` 函数。 - 对于更复杂的验证需求,请参考 validator 的文档。

正文

封装语言包翻译器

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中的使用相似的内容:

validator库在gin中的使用

目录封装语言包翻译器tag中设置验证规则控制层验curl请求返回结果 封装语言包翻译器 package validator import ( "fmt" "net/http" "reflect" "github.com/go-playground/locales/zh_Hans_CN" unTran

dubbo~javax.validation和jakarta.validation的介绍与排雷

javax.validation和jakarta.validation都是用于Java中进行数据验证(validation)的相关API,它们提供了一套标准的验证框架,用于验证Java对象的属性是否符合指定的约束条件。这两个API的作用类似,只是在Java EE平台的演进过程中发生了一些变化。 ja

如何实现 Java SpringBoot 自动验证入参数据的有效性

Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证 如果碰到 `@NotEmpty` 否则不生效,注意看下 `@RequestBody` 前面是否加上了`@Valid`

x509: cannot validate certificate for xxx because it doesn't contain any IP SANs

项目中有时候需要访问https网站,但如果该网站使用的是自建证书,那client端验证server端证书时,有时候会报错: > x509: cannot validate certificate for xxx because it doesn't contain any IP SANs 碰到这种情

salesforce零基础学习(一百三十一)Validation 一次的bypass设计

本篇参考: https://admin.salesforce.com/blog/2022/how-i-solved-it-bypass-validation-rules-in-flows 背景:作为系统的全局考虑,我们在设计validation rule / flow / trigger时,往往会使

[转帖]SSL数字证书分类DV/OV/EV

SSL证书的分类主要是通过下面两个维度进行分类: 1.根据验证模式分类 根据CA机构对申请者的身份审核范围分为:DV证书、OV证书、EV证书。 1.1.DV证书(域名证书) DV(Domain Validated)证书是最常见的一种证书类型,大多数免费证书都此类证书。CA机构获取CSR证书请求后,从