使用Gin框架进行参数验证并支持多语言可以使我们的Web应用程序更加健壮和易于维护。通过使用
validator
包和binding
包,我们可以轻松地实现参数验证,并通过多语言支持来提高用户体验。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/zh"
"github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zh_translations "github.com/go-playground/validator/v10/translations/zh"
"net/http"
)
var trans ut.Translator
func init() {
// 创建翻译器
uni := ut.New(zh.New())
trans, _ = uni.GetTranslator("zh")
// 注册翻译器
v, ok := binding.Validator.Engine().(*validator.Validate)
if ok {
_ = zh_translations.RegisterDefaultTranslations(v, trans)
}
}
type User struct {
Name string `form:"name" binding:"required"`
Email string `form:"email" binding:"required,email"`
}
func main() {
r := gin.Default()
// 注册路由
r.POST("/user", func(c *gin.Context) {
var user User
if err := c.ShouldBindWith(&user, binding.Form); err != nil {
// 参数验证失败
errs, ok := err.(validator.ValidationErrors)
if !ok {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
// 获取错误信息
errMsg := make(map[string]string)
for _, e := range errs {
errMsg[e.Field()] = e.Translate(trans)
}
c.JSON(http.StatusBadRequest, gin.H{
"error": errMsg,
})
return
}
// 参数验证成功
c.JSON(http.StatusOK, gin.H{
"message": fmt.Sprintf("Hello, %s! Your email is %s.", user.Name, user.Email),
})
})
// 启动HTTP服务器
r.Run()
}
在这个示例中,我们定义了一个User
结构体,其中包含Name
和Email
两个字段。在路由处理函数中,我们使用ShouldBindWith
函数将请求参数绑定到User
结构体中,并使用binding.Form
参数指定参数来源为表单。如果参数验证失败,我们使用validator.ValidationErrors
类型来获取错误信息,并使用Translate
函数将错误信息翻译为指定语言。在这里,我们使用了zh语言,并定义了required
和email
两个验证规则的翻译。最后,我们使用RegisterTranslation
函数将翻译规则注册到validator
包中。