golang验证结构体
相当于验证用户上传的json参数
定义结构
package dto
type TestJsonReq struct {
Name string `json:"name" binding:"min=3,max=20,required"`
Password string `json:"password" binding:"required"`
Age int `json:"age" binding:"required,gte=10"`
}
type TestFormReq struct {
Name string `form:"name" binding:"min=3,max=20,required"`
Password string `form:"password" binding:"required"`
}
type TestParamsReq struct {
Name string `form:"name" binding:"min=3,max=20,required"`
Password string `form:"password"`
基础验证使用
package collections
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
// 处理json表单数据验证
func ValidateJsonBody(c *gin.Context, obj interface{}) bool {
if err := c.ShouldBindJSON(obj); err != nil {
validateReq(c, err)
return false
}
return true
}
// 处理form表单数据验证
func ValidateForm(c *gin.Context, obj interface{}) bool {
if err := c.ShouldBind(obj); err != nil {
validateReq(c, err)
return false
}
return true
}
// 处理api/v1/user?name=xxx&age=xxx 请求参数的校验
func ValidateParams(c *gin.Context, obj interface{}) bool {
if err := c.ShouldBindQuery(obj); err != nil {
validateReq(c, err)
return false
}
return true
}
func validateReq(c *gin.Context, err error) {
validationErrors, ok := err.(validator.ValidationErrors)
if ok {
c.JSON(http.StatusBadRequest, gin.H{
"error": validationErrors.Error(),
})
} else {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
}
c.Abort() // 中断请求
}
在接口中使用
func (t *testController) TestParams(c *gin.Context) {
var req dto.TestParamsReq
if !collections.ValidateParams(c, &req) {
return
}
c.JSON(http.StatusOK, gin.H{
"message": "test",
})
}