validator库在gin中的使用

目录

  • 封装语言包翻译器
  • tag中设置验证规则
  • 控制层验
  • curl请求
  • 返回结果

封装语言包翻译器

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
}
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
}
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:自定义错误提示

// UserAddress 结构体
type UserAddress struct {
global.GVA_MODEL
Address string `json:"address" form:"address" validate:"required,min=1,max=160" label:"地址" gorm:"column:address;comment:地址;size:1000;default:'';"` //地址
State int `json:"state" validate:"required,oneof=1 2" label:"状态 1:显示 2:隐藏"`
State2 int `json:"state" form:"state" validate:"required,gt=0" lable:"状态" gorm:"index;column:state;comment:erp状态 1=待销售审核,7=待财务审核;size:10;type:int(11);default:1;"` //状态:
ContactPerson string `json:"contactPerson" form:"contactPerson" validate:"required" label:"联系人" gorm:"column:contact_person;comment:联系人;size:255;default:'';"` //联系人
Full bool `json:"full" form:"full" validate:"omitempty,oneof=true false" lable:"是否查询全部"`
Mobile string `json:"mobile" form:"mobile" validate:"required,min=11" label:"手机号" gorm:"column:mobile;comment:手机号;size:12;default:'';"` //手机号
Email string `json:"email" validate:"required,email" label:"邮箱"`
ProtocolIds []int `form:"protocolIds[]" search:"-" validate:"omitempty,len=1" label:"协议ids" comment:"协议ids"`
ExportType string `form:"exportType" search:"-" validate:"omitempty,oneof=csv xlsx" label:"导出类型 :csv(默认) / xlsx"`
ManuId int `json:"manuId" form:"manuId" gorm:"column:manu_id;comment:经销商ID;"`
Mark string `json:"mark" form:"mark" gorm:"column:mark;comment:注意;size:1000;default:'';"`
global.GVA_DATA_AUTH_MODEL
}
// UserAddress 结构体
type UserAddress struct {
  global.GVA_MODEL
  Address       string `json:"address" form:"address"  validate:"required,min=1,max=160" label:"地址" gorm:"column:address;comment:地址;size:1000;default:'';"` //地址
  State         int    `json:"state" validate:"required,oneof=1 2" label:"状态 1:显示 2:隐藏"`
  State2        int     `json:"state" form:"state" validate:"required,gt=0" lable:"状态" gorm:"index;column:state;comment:erp状态 1=待销售审核,7=待财务审核;size:10;type:int(11);default:1;"` //状态:
  ContactPerson string `json:"contactPerson" form:"contactPerson" validate:"required" label:"联系人" gorm:"column:contact_person;comment:联系人;size:255;default:'';"` //联系人
  Full          bool   `json:"full" form:"full" validate:"omitempty,oneof=true false" lable:"是否查询全部"`
  Mobile        string `json:"mobile" form:"mobile"  validate:"required,min=11" label:"手机号" gorm:"column:mobile;comment:手机号;size:12;default:'';"` //手机号
  Email         string `json:"email"  validate:"required,email" label:"邮箱"`
  ProtocolIds   []int  `form:"protocolIds[]" search:"-" validate:"omitempty,len=1" label:"协议ids" comment:"协议ids"`
  ExportType    string `form:"exportType" search:"-" validate:"omitempty,oneof=csv xlsx" label:"导出类型 :csv(默认) / xlsx"`
  ManuId        int    `json:"manuId" form:"manuId" gorm:"column:manu_id;comment:经销商ID;"`
  Mark          string `json:"mark" form:"mark" gorm:"column:mark;comment:注意;size:1000;default:'';"`
  global.GVA_DATA_AUTH_MODEL
}
// UserAddress 结构体 type UserAddress struct { global.GVA_MODEL Address string `json:"address" form:"address" validate:"required,min=1,max=160" label:"地址" gorm:"column:address;comment:地址;size:1000;default:'';"` //地址 State int `json:"state" validate:"required,oneof=1 2" label:"状态 1:显示 2:隐藏"` State2 int `json:"state" form:"state" validate:"required,gt=0" lable:"状态" gorm:"index;column:state;comment:erp状态 1=待销售审核,7=待财务审核;size:10;type:int(11);default:1;"` //状态: ContactPerson string `json:"contactPerson" form:"contactPerson" validate:"required" label:"联系人" gorm:"column:contact_person;comment:联系人;size:255;default:'';"` //联系人 Full bool `json:"full" form:"full" validate:"omitempty,oneof=true false" lable:"是否查询全部"` Mobile string `json:"mobile" form:"mobile" validate:"required,min=11" label:"手机号" gorm:"column:mobile;comment:手机号;size:12;default:'';"` //手机号 Email string `json:"email" validate:"required,email" label:"邮箱"` ProtocolIds []int `form:"protocolIds[]" search:"-" validate:"omitempty,len=1" label:"协议ids" comment:"协议ids"` ExportType string `form:"exportType" search:"-" validate:"omitempty,oneof=csv xlsx" label:"导出类型 :csv(默认) / xlsx"` ManuId int `json:"manuId" form:"manuId" gorm:"column:manu_id;comment:经销商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)
}
}
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)
  }
}
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"
}'
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"
}'
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:手机号为必填字段"
}
{
    "code": 7,
    "data": {},
    "msg": "参数验证失败!code:422 msg:手机号为必填字段"
}
{ "code": 7, "data": {}, "msg": "参数验证失败!code:422 msg:手机号为必填字段" }

参考文章:
https://www.liwenzhou.com/posts/Go/validator-usages/#c-1-0-2

© 版权声明
THE END
支持一下吧
点赞14 分享
681fb1064ae16fb9的头像-牛翰网
评论 共2条
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复
    • 头像Inscreva-se na binance0