Go-Gin中优雅的实现参数校验,自定义错误消息提示
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"net/http"
)
// 定义自定义错误处理器
func validateErrorHandler(err error) gin.HandlerFunc {
return func(c *gin.Context) {
if err, ok := err.(validator.ValidationErrors); ok {
// 通过validator.ValidationErrors获取错误信息
var errorMsg string
for _, e := range err {
errorMsg += e.Field() + " " + e.ActualTag() + " " + e.Param() + ". "
}
c.JSON(http.StatusBadRequest, gin.H{"error": errorMsg})
} else {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal server error"})
}
c.Abort()
}
}
func main() {
router := gin.Default()
// 使用自定义错误处理器
router.Use(validateErrorHandler())
// 定义参数结构体
type RegisterParams struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
Email string `json:"email" binding:"required,email"`
}
// 注册接口
router.POST("/register", func(c *gin.Context) {
var params RegisterParams
if err := c.ShouldBindJSON(¶ms); err != nil {
// 验证失败,中断后续操作
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "Validation failed"})
return
}
// 验证成功,其他业务逻辑
fmt.Printf("Register with params: %#v\n", params)
c.JSON(http.StatusOK, gin.H{"message": "Registered successfully!"})
})
router.Run(":8080")
}
这段代码定义了一个自定义错误处理器validateErrorHandler
,用于处理参数验证失败的错误。在Gin的路由中使用了这个中间件,并在/register
接口的处理函数中,如果验证失败,会调用c.AbortWithStatusJSON
中断请求,并返回自定义的错误信息。如果输入的参数通过了验证,则执行后续的业务逻辑。
评论已关闭