package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"net/http"
)
// 定义验证结果
type ValidationResult struct {
Errors map[string][]string
}
// 定义验证器接口
type Validator interface {
Validate(c *gin.Context, obj interface{}) (bool, ValidationResult)
}
// 实现Gin框架中的验证器
type GinValidator struct{}
// 实现Validate方法
func (v *GinValidator) Validate(c *gin.Context, obj interface{}) (bool, ValidationResult) {
errs := make(map[string][]string)
if err := c.ShouldBind(obj); err != nil {
// 这里可以添加具体的错误处理逻辑
errs["_general"] = []string{"数据验证失败"}
return false, ValidationResult{Errors: errs}
}
return true, ValidationResult{}
}
// 使用GinValidator进行数据绑定和验证
func ValidatedBind(c *gin.Context, obj interface{}) (bool, ValidationResult) {
validator := &GinValidator{}
success, validationResult := validator.Validate(c, obj)
return success, validationResult
}
// 示例路由处理函数
func HandlePost(c *gin.Context) {
var json InputModel
success, validationResult := ValidatedBind(c, &json)
if !success {
c.JSON(http.StatusBadRequest, gin.H{"errors": validationResult.Errors})
return
}
c.JSON(http.StatusOK, gin.H{"message": "数据验证成功"})
}
// 示例输入模型
type InputModel struct {
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
}
func main() {
router := gin.Default()
// 使用Gin的JSON绑定机制
binding.BindJson = binding.Default("json")
// 注册路由
router.POST("/post", HandlePost)
// 启动服务器
port := "8080"
router.Run(fmt.Sprintf(":%s", port))
}
这个代码示例展示了如何在Gin框架中创建一个简单的验证器,并在POST请求处理函数中使用它来验证输入数据的有效性。如果数据验证失败,它将返回错误信息,否则处理函数会继续执行。这是一个很好的教学示例,因为它演示了如何将Gin框架与自定义验证逻辑结合起来。