请验证输入以排除子字符串



我想确保输入不包括子字符串"组织"被禁止的";并且不等于"0";foo";以及";条";。

// cmd/httpd/handler/item_post.go
package handler
import (
"net/http"
"dummy-project/itemdata"
"github.com/gin-gonic/gin"
)
func ItemPost() gin.HandlerFunc {
return func(c *gin.Context) {
requestBody := itemdata.Item{}
if err := c.ShouldBindJSON(&requestBody); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"message": err.Error()})
return
}
// insert Item object to DB
c.JSON(http.StatusCreated, requestBody)
}
}

下面是我用于POST请求和插入DB记录的结构://itemdata/item_data.go包裹项目数据

// Item struct used for POST request and inserting new item
type Item struct {
ID           string `bson:"_id" json:"id"`
Name string `bson:"name" json:"name" binding:"required,excludesrune=organizationforbidden,ne=foo,ne=bar"`
}

当我插入这些值时:foo->在排除符文上验证失败

条形图->ne 验证失败

组织->在排除符文上验证失败

orgfor->在排除符文上验证失败

禁止->在排除符文上验证失败

BAR->成功

我想要什么:foo->失败

条形图->失败

组织->失败

orgfor->成功,因为组织和禁言并不是的全部

禁止->失败

BAR->失败

如何使用go-gin-and-go-validator实现这一点?感谢

看起来您正在尝试排除整个字符串,因此excludes验证比excludesrune更合适。A";符文";在Go中是一个Unicode代码点,您可能更习惯于将其称为";字符";,因此,您编写的验证可能会使包含字母o的任何字符串失败。

试试这个:

Name string `bson:"name" json:"name" binding:"required,excludes=organization,excludes=forbidden,ne=foo,ne=bar"`

编辑:正如评论中所指出的,这不符合您不允许大写版本的阻塞字符串的要求。据我所知,您需要使用一个自定义验证器:

func caseInsensitiveExcludes(fl validator.FieldLevel) bool {
lowerValue := strings.ToLower(fl.Field().String())

if strings.Contains(lowerValue, fl.Param()) {
return false
}
return true
}
validate.RegisterValidation("iexcludes", caseInsensitiveExcludes)

然后尝试这个字段定义:

Name string `bson:"name" json:"name" binding:"required,iexcludes=organization,iexcludes=forbidden,ne=foo,ne=bar"`

相关内容

  • 没有找到相关文章

最新更新