一架梯子,一头程序猿,仰望星空!
Golang GIN框架面试题 > 内容正文

Gin 框架中如何处理请求参数校验?


问题简答

在Gin 框架中处理请求参数校验,通常有两种方式,一种是直接通过if条件判断参数是否合法,另外一种比较方便通过参数绑定和验证器(validator)处理参数校验。

问题详解:

Gin 框架参数校验主要使用binding包或者validator 包处理。

使用 binding 包

Gin 框架提供了 binding 包,可以将请求参数绑定到一个结构体中,并对这些参数进行验证。使用这种方法需要定义结构体,并在结构体的字段上添加 tag,指定验证规则。

例子:

package main

import (
    "github.com/gin-gonic/gin"
    // 导入binding包
    "github.com/gin-gonic/gin/binding"
    "net/http"
    "time"
)

// 在结构体字段上通过设置binding标签属性设置required,表示字段必填
type Login struct {
    User     string `json:"user" binding:"required"`
    Password string `json:"password" binding:"required"`
}

func main() {
    router := gin.Default()

    // 添加路由
    router.POST("/login", func(c *gin.Context) {
        var json Login
        // 将请求参数绑定到结构体,会自动进行参数校验
        if err := c.ShouldBindWith(&json, binding.JSON); err == nil {
           // 参数校验成功
        } else {
          // 参数校验失败,返回错误
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        }
    })
    // 忽略
}

使用 validator 包

使用 go-playground/validator/v10 包,这是 validator 包的一个改进版,提供了更多的验证规则,需要在结构体的字段上添加 tag,指定验证规则。

例子:

package main

import (
    "github.com/gin-gonic/gin"
    // 导入go-playground/validator/v10 包
    "github.com/go-playground/validator/v10"
    "net/http"
)

// 也是通过设置struct字段标签属性binding,定义各种参数校验规则
type CreateUserRequest struct {
    // Username必填,长度最小4,最大16
    Username string `json:"username" binding:"required,min=4,max=16"`
    // Email必填,并且是email格式
    Email string `json:"email" binding:"required,email"`
    // Password必填,长度最小6,最大16
    Password string `json:"password" binding:"required,min=6,max=16"`
}

func main() {
    r := gin.Default()

    r.POST("/user", func(c *gin.Context) {
        var req CreateUserRequest
        // 通过ShouldBindJSON方法将请求参数绑定到req结构体,会自动进行参数校验
        if err := c.ShouldBindJSON(&req); err != nil {
            //  参数校验失败,返回错误
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }

        // TODO: 业务逻辑处理
    })
    // 忽略
}