Go gin 验证输入以排除子字符串
Go gin validate input to exclude substring
我想确保输入不包含子字符串“organization”、“forbidden”并且不等于“foo”和“bar”。
// 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 请求和插入数据库记录的结构:
// 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 -> 验证失败排除 rune
bar -> ne
验证失败
组织 -> 排除符文验证失败
orgfor -> 排除符文验证失败
禁止 -> 排除符文验证失败
BAR -> 成功
我想要什么:
foo -> 失败
bar -> 失败
组织 -> 失败
orgfor -> 成功,因为组织和禁词不完整
禁止 -> 失败
BAR -> 失败
我如何使用 go gin 和 go validator 实现这个?谢谢
您似乎在尝试排除整个字符串,因此 excludes
验证比 excludesrune
更合适。 Go 中的“符文”是一个 Unicode 代码点,您可能更习惯于将其称为“字符”,因此您编写的验证可能会使任何包含字母 o
.[= 的字符串失败16=]
试试这个:
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"`
我想确保输入不包含子字符串“organization”、“forbidden”并且不等于“foo”和“bar”。
// 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 请求和插入数据库记录的结构: // 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 -> 验证失败排除 rune
bar -> ne
验证失败组织 -> 排除符文验证失败
orgfor -> 排除符文验证失败
禁止 -> 排除符文验证失败
BAR -> 成功
我想要什么: foo -> 失败
bar -> 失败
组织 -> 失败
orgfor -> 成功,因为组织和禁词不完整
禁止 -> 失败
BAR -> 失败
我如何使用 go gin 和 go validator 实现这个?谢谢
您似乎在尝试排除整个字符串,因此 excludes
验证比 excludesrune
更合适。 Go 中的“符文”是一个 Unicode 代码点,您可能更习惯于将其称为“字符”,因此您编写的验证可能会使任何包含字母 o
.[= 的字符串失败16=]
试试这个:
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"`