validator库在gin中的使用

打印 上一主题 下一主题

主题 916|帖子 916|积分 2748

目录

封装语言包翻译器
  1. package validator
  2. import (
  3.         "fmt"
  4.         "net/http"
  5.         "reflect"
  6.         "github.com/go-playground/locales/zh_Hans_CN"
  7.         unTrans "github.com/go-playground/universal-translator"
  8.         "github.com/go-playground/validator/v10"
  9.         zhTrans "github.com/go-playground/validator/v10/translations/zh"
  10. )
  11. func Validate(data interface{}) (string, int) {
  12.         validate := validator.New()
  13.         uni := unTrans.New(zh_Hans_CN.New())
  14.         trans, _ := uni.GetTranslator("zh_Hans_CN")
  15.         err := zhTrans.RegisterDefaultTranslations(validate, trans)
  16.         if err != nil {
  17.                 fmt.Println("err:", err)
  18.         }
  19.         validate.RegisterTagNameFunc(func(field reflect.StructField) string {
  20.                 label := field.Tag.Get("label")
  21.                 return label
  22.         })
  23.         err = validate.Struct(data)
  24.         if err != nil {
  25.                 for _, v := range err.(validator.ValidationErrors) {
  26.                         return v.Translate(trans), http.StatusUnprocessableEntity
  27.                 }
  28.         }
  29.         return "", 0
  30. }
复制代码
tag中设置验证规则

validate:定义验证规则
lable:自定义错误提示
  1. // UserAddress 结构体
  2. type UserAddress struct {
  3.         global.GVA_MODEL
  4.         Address       string `json:"address" form:"address"  validate:"required,min=1,max=160" label:"地址" gorm:"column:address;comment:地址;size:1000;default:'';"` //地址
  5.         State         int    `json:"state" validate:"required,oneof=1 2" label:"状态 1:显示 2:隐藏"`
  6.         ContactPerson string `json:"contactPerson" form:"contactPerson" validate:"required" label:"联系人" gorm:"column:contact_person;comment:联系人;size:255;default:'';"` //联系人
  7.         Full          bool   `json:"full" form:"full" validate:"omitempty,oneof=true false" lable:"是否查询全部"`
  8.         Mobile        string `json:"mobile" form:"mobile"  validate:"required,min=11" label:"手机号" gorm:"column:mobile;comment:手机号;size:12;default:'';"` //手机号
  9.         Email         string `json:"email"  validate:"required,email" label:"邮箱"`
  10.         ProtocolIds   []int  `form:"protocolIds[]" search:"-" validate:"omitempty,len=1" label:"协议ids" comment:"协议ids"`
  11.         ExportType    string `form:"exportType" search:"-" validate:"omitempty,oneof=csv xlsx" label:"导出类型 :csv(默认) / xlsx"`
  12.         ManuId        int    `json:"manuId" form:"manuId" gorm:"column:manu_id;comment:经销商ID;"`
  13.         Mark          string `json:"mark" form:"mark" gorm:"column:mark;comment:注意;size:1000;default:'';"`
  14.         global.GVA_DATA_AUTH_MODEL
  15. }
复制代码
更多验证规则参考手册
https://github.com/go-playground/validator
控制层验
  1. func (userAddressApi *UserAddressApi) CreateDealerUserAddress(c *gin.Context) {
  2.         userToken, _, e := common.GetContextDealerUser(c)
  3.         if e != nil {
  4.                 response.FailWithMessage("获取用户信息失败", c)
  5.                 return
  6.         }
  7.         var userAddressApi erp.UserAddress
  8.         err := c.ShouldBindJSON(&userAddressApi)
  9.         if err != nil {
  10.                 global.GVA_LOG.Error("参数解析失败!", zap.Error(err))
  11.                 response.FailWithMessage("参数解析失败", c)
  12.                 return
  13.         }
  14.         if msg, errCode := validator.Validate(userAddressApi); errCode != 0 {
  15.                 err := fmt.Errorf("参数验证失败!code:%d msg:%s", errCode, msg)
  16.                 global.GVA_LOG.Error(err.Error(), zap.Error(err))
  17.                 response.FailWithMessage(err.Error(), c)
  18.                 return
  19.         }
  20.         if err := userAddressService.CreateUserAddress(&userAddressApi, userToken); err != nil {
  21.                 global.GVA_LOG.Error("创建失败!", zap.Error(err))
  22.                 response.FailWithMessage("创建失败", c)
  23.         } else {
  24.                 response.OkWithDetailed(userAddressApi, "创建成功", c)
  25.         }
  26. }
复制代码
curl请求
  1. curl --location --request POST 'http://127.0.0.1:8889/dealerClientErp/createDealerClient' \
  2. --header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
  3. --header 'Content-Type: application/json' \
  4. --header 'Accept: */*' \
  5. --header 'Host: 127.0.0.1:8889' \
  6. --header 'Connection: keep-alive' \
  7. --data-raw '{
  8.     "username": "haima1",
  9.     "mobile": "",
  10.     "clientType": 3,
  11.     "mark": "this is test"
  12. }'
复制代码
返回效果
  1. {
  2.     "code": 7,
  3.     "data": {},
  4.     "msg": "参数验证失败!code:422 msg:手机号为必填字段"
  5. }
复制代码
参考文章:
https://www.liwenzhou.com/posts/Go/validator-usages/#c-1-0-2

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表