参数自动绑定和校验是 Web 框架很重要的两个功能,可以极大的提升开发速度,并更好的保证数据的可靠性(服务端数据校验很重要)。话不啰嗦,直接上 demo
用到的第三方包: gp-palyground/validator
github.com/go-playground/validator/v10
Demo
package main
func main() {e := echo.New()
e.POST("/test/validator", func(c echo.Context) error {
type User struct {
Name string `json:"name" validate:"required"`
Age uint `json:"age" validate:"required,gte=1,lte=100"`
Email string `json:"email" validate:"required,email"`
}
user := &User{}
err := c.Bind(user)
validate := validator.New()
e := en.New()
uniTrans := ut.New(e, e, zh.New())
translator, _ := uniTrans.GetTranslator("zh")
err := zh2.RegisterDefaultTranslations(validate, translator)
if err != nil {log.Fatal(fmt.Sprintf("i18n 转换失败 "), zap.Error(err))
}
err = validate.Struct(user)
if err != nil {errs := err.(validator.ValidationErrors)
var msg string
for _, err := range errs {msg = err.Translate(translator)
}
return c.JSON(http.StatusOK, msg)
}
return c.JSON(http.StatusOK, user)
})
e.Logger.Fatal(e.Start(":9000")
}
拆分
validate/validate.go
package validate
import (
"log"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zh2 "github.com/go-playground/validator/v10/translations/zh"
)
type BindValidate struct{}
var Bv *BindValidate
// BindValidate
// i18n
func (bv *BindValidate) BindValidate() (ut.Translator, *validator.Validate) {validate := validator.New()
e := en.New()
unitrans := ut.New(e, e, zh.New())
translator, _ := unitrans.GetTranslator("zh")
err := zh2.RegisterDefaultTranslations(validate, translator)
if err != nil {log.Printf("i18n 国际化失败: %v", err)
}
return translator, validate
}
utils/validate.go
package utils
import (
validate2 "github.com/demo/common/validate"
"github.com/go-playground/validator/v10"
)
var msg string
// ValidateParam
func ValidateParam(params interface{}) string {translator, validate := validate2.Bv.BindValidate()
err := validate.Struct(params)
if err != nil {errs := err.(validator.ValidationErrors)
for _, err := range errs {msg = err.Translate(translator)
}
return msg
}
return ""
}
使用
handler/auth.go
type AuthLoginParams struct {
LoginAccount string `json:"login_account" validate:"required"`
Password string `json:"password" validate:"required,gte=6,lte=12"`
}
func AuthLogin(c echo.Context) error {param := &AuthLoginParams{}
_ = c.Bind(param)
msg := utils.ValidateParam(param)
if msg != "" {return utils.ToJson(c, utils.Res.FailResponseJson(cast.ToString(msg), ""))
}
}
正文完