我想确保输入不包括子字符串"组织"被禁止的";并且不等于"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"`