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: 业务逻辑处理
})
// 忽略
}