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

在这里插入图片描述

使用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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
38
粉丝
16
喜欢
133
收藏
117
排名:325
访问:2.9 万
私信
所有博文
社区赞助商