[ gin验证请求参数 ]


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",
    })
}