gin自定义验证器&转化中文 您所在的位置:网站首页 key的翻译成中文 gin自定义验证器&转化中文

gin自定义验证器&转化中文

2024-04-11 06:28| 来源: 网络整理| 查看: 265

在这里插入图片描述

使用gin 自带 绑定验证参数返回的是乱的英文,对于国人来说看起来不是特别友好

{ "message": "Key: 'Booking.CheckIn' Error:Field validation for 'CheckIn' failed on the 'required' tag\nKey: 'Booking.CheckOut' Error:Field validation for 'CheckOut' failed on the 'required' tag" } validator 翻译成中文

新建文件 validator

package validator //gin > 1.4.0 //将验证器错误翻译成中文 import ( "github.com/gin-gonic/gin/binding" "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zh_translations "github.com/go-playground/validator/v10/translations/zh" ) var ( uni *ut.UniversalTranslator validate *validator.Validate trans ut.Translator ) func Init() { //注册翻译器 zh := zh.New() uni = ut.New(zh, zh) trans, _ = uni.GetTranslator("zh") //获取gin的校验器 validate := binding.Validator.Engine().(*validator.Validate) //注册翻译器 zh_translations.RegisterDefaultTranslations(validate, trans) } //Translate 翻译错误信息 func Translate(err error) map[string][]string { var result = make(map[string][]string) errors := err.(validator.ValidationErrors) for _, err := range errors{ result[err.Field()] = append(result[err.Field()], err.Translate(trans)) } return result }

在main 中初始化

validator.Init() 控制器中: package api import ( "github.com/gin-gonic/gin" "yibage-api/validator" ) type Booking struct { CheckIn string `form:"check_in" binding:"required"` CheckOut string`form:"check_out" binding:"required"` } func Test(c *gin.Context) { var b Booking err := c.BindQuery(&b); if err == nil { c.JSON(200, gin.H{"message": "Success"}) return; } else { c.JSON(200, gin.H{"message": validator.Translate(err)}) return; } }

上面用到了 在validator 中 的翻译 validator.Translate(err)

效果: { "message": { "CheckIn": [ "CheckIn为必填字段" ], "CheckOut": [ "CheckOut为必填字段" ] } } 自定义参数验证器 package main import ( "net/http" "reflect" "time" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "gopkg.in/go-playground/validator.v8" ) // Booking contains binded and validated data. type Booking struct { CheckIn time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"` CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn" time_format:"2006-01-02"` } func bookableDate( v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string, ) bool { if date, ok := field.Interface().(time.Time); ok { today := time.Now() if today.Year() > date.Year() || today.YearDay() > date.YearDay() { return false } } return true } func main() { route := gin.Default() if v, ok := binding.Validator.Engine().(*validator.Validate); ok { v.RegisterValidation("bookabledate", bookableDate) } route.GET("/bookable", getBookable) route.Run(":8085") } func getBookable(c *gin.Context) { var b Booking if err := c.ShouldBindWith(&b, binding.Query); err == nil { c.JSON(http.StatusOK, gin.H{"message": "Booking dates are valid!"}) } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } }

参考:www.kancloud.cn/shuangdeyu/gin_boo...

本作品采用《CC 协议》,转载必须注明作者和本文链接 和我做朋友?


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有