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 协议》,转载必须注明作者和本文链接
推荐文章: