ZBLOG

gin 框架如何为binding 设置自定义validator

在Gin框架中,你可以通过实现自定义的验证器来为binding设置自定义的validator。以下是一个示例代码:

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
	"gopkg.in/go-playground/validator.v9"
)

// 自定义错误信息映射
var validationErrors = map[string]string{
    "customValidation": "自定义验证失败",
}

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

	// 注册自定义验证器
	v := validator.New()
	v.RegisterValidation("customValidation", customValidator)
	router.SetValidator(v)

	router.GET("/test", testHandler)

	router.Run(":8080")
}

func testHandler(c *gin.Context) {
	type User struct {
		Name  string `form:"name" binding:"required,customValidation"`
	}

	var user User
	if err := c.ShouldBind(&user); err != nil {
	    // 处理绑定错误
	    if errs, ok := err.(validator.ValidationErrors); ok {
	        errMsg := translateValidationError(errs)
	        c.JSON(http.StatusBadRequest, gin.H{"error": errMsg})
	        return
	    }
	    
	    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
	    return
	}

	c.JSON(http.StatusOK, gin.H{"user": user})
}

func customValidator(fl validator.FieldLevel) bool {
	value := fl.Field().String()

    // 执行自定义验证逻辑,并返回结果
	return value == "example"
}

func translateValidationError(errs validator.ValidationErrors) map[string]string {
	errMap := make(map[string]string)
	for _, e := range errs {
		fieldName := e.Field()
        message := translateMessage(e.Tag())

        errMap[fieldName] = message
    }

    return errMap
}

func translateMessage(tag string) string {
	if msg, ok := validationErrors[tag]; ok {
	    return msg
    }
    
    return "该字段无效"
}

在上述示例代码中,我们首先定义了一个自定义验证器customValidator,它会检查字段值是否等于”example”。然后,在Gin框架中通过调用RegisterValidation()方法来注册这个自定义验证器。

接下来,在处理函数testHandler中,我们使用了binding:"required,customValidation"来指定需要进行验证的规则。如果绑定失败或自定义验证失败,我们可以通过调用translateValidationError()函数将错误信息翻译为对应的消息,并返回给客户端。

请注意,以上只是一个示例,你可以根据实际需求和业务逻辑进行相应的修改和扩展。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=14482

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?