|
@@ -128,6 +128,7 @@ func registerCustomValidations(v *validator.Validate) {
|
|
|
// 注册 hostport 校验器
|
|
|
v.RegisterValidation("hostport", validateHostPort)
|
|
|
v.RegisterValidation("idn_fqdn",isIdnFqdn)
|
|
|
+ v.RegisterValidation("isPortStringValid", isPortStringValid)
|
|
|
|
|
|
// 为 hostport 校验器注册中文翻译
|
|
|
v.RegisterTranslation("hostport", trans, func(ut ut.Translator) error {
|
|
@@ -143,6 +144,13 @@ func registerCustomValidations(v *validator.Validate) {
|
|
|
t, _ := ut.T("idn_fqdn", fe.Field())
|
|
|
return t
|
|
|
})
|
|
|
+
|
|
|
+ v.RegisterTranslation("isPortStringValid", trans, func(ut ut.Translator) error {
|
|
|
+ return ut.Add("isPortStringValid", "{0} 必须是有效的端口号", true)
|
|
|
+ }, func(ut ut.Translator, fe validator.FieldError) string {
|
|
|
+ t, _ := ut.T("isPortStringValid", fe.Field())
|
|
|
+ return t
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
// validateHostPort 是一个自定义校验函数,用于检查字符串是否为有效的 "host:port"。
|
|
@@ -227,4 +235,25 @@ func isIdnFqdn(fl validator.FieldLevel) bool {
|
|
|
|
|
|
// 如果没有错误,说明它在格式上是一个有效的 FQDN。
|
|
|
return err == nil
|
|
|
+}
|
|
|
+
|
|
|
+func isPortStringValid(fl validator.FieldLevel) bool {
|
|
|
+ // 1. 获取字段的字符串值
|
|
|
+ portStr := fl.Field().String()
|
|
|
+
|
|
|
+ // 2. 将字符串转换为整数
|
|
|
+ // 注意:Atoi 已经确保了字符串是纯数字,所以 'numeric' 标签其实有点冗余,但保留它有助于提前过滤和提供更清晰的错误。
|
|
|
+ portNum, err := strconv.Atoi(portStr)
|
|
|
+ if err != nil {
|
|
|
+ // 如果无法转换为整数(例如,包含非数字字符),则验证失败。
|
|
|
+ // 理论上 'numeric' 标签会先捕捉到这个错误。
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 检查数值范围
|
|
|
+ if portNum >= 1 && portNum <= 65535 {
|
|
|
+ return true // 在有效范围内,验证通过
|
|
|
+ }
|
|
|
+
|
|
|
+ return false // 不在有效范围内,验证失败
|
|
|
}
|