gin中如何自定义验证器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main
 
import (
    "github.com/gin-gonic/gin"
    "github.com/gin-gonic/gin/binding"
    "github.com/go-playground/validator/v10"
    "net/http"
    "time"
)
 
type Booking struct {
    // 包含绑定和验证的数据,bookabledate就是自定义的验证函数
    CheckIn time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"`
    // gtfield=CheckIn只对数字或时间有效,参考官网链接
    // https://pkg.go.dev/github.com/go-playground/validator/v10#section-readme
    CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn,bookabledate" time_format:"2006-01-02"`
}
 
// 自定义验证器
var bookableDate validator.Func = func(fl validator.FieldLevel) bool {
    if date, ok := fl.Field().Interface().(time.Time); ok {
        today := time.Now()
        if today.After(date) {  // 输入的日期必须大于今天的日期,否则验证失败
            return false
        }
    }
    return true
}
 
func main() {
    router := gin.Default()
 
    // 注册验证器
    validate, ok := binding.Validator.Engine().(*validator.Validate)
    if ok {
        validate.RegisterValidation("bookabledate", bookableDate)
    }
 
    router.GET("/bookable", getBookable)
    router.Run()
}
 
func getBookable(context *gin.Context) {
    var book Booking
    if err := context.ShouldBindWith(&book, binding.Query); err == nil {
        context.JSON(200, gin.H{"message": "book date is valid"})
    } else {
        context.JSON(http.StatusBadRequest, gin.H{"err": err.Error()})
    }
}

  

自定义mobile验证器

1
2
3
4
5
6
7
8
9
10
11
12
// 自定义验证器
func ValidateMobile(fl validator.FieldLevel) bool {
    mobile := fl.Field().String()
    // 使用正则表达式判断mobile是否合法
    //pattern := "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$"
    pattern := `^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$`
    ok, _ := regexp.MatchString(pattern, mobile)
    if !ok{
        return false
    }
    return true
}<br><br>// 5. 注册验证器<br>if v, ok := binding.Validator.Engine().(*validator.Validate); ok {<br>   _ = v.RegisterValidation("mobile", myvalidator.ValidateMobile)<br>}

  

posted @   专职  阅读(378)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示