gpt4 book ai didi

go - 已发布数据验证的 GIN 问题

转载 作者:行者123 更新时间:2023-12-01 22:17:05 25 4
gpt4 key购买 nike

我目前正在学习 GO,我想复制我们在生产中运行的一项服务,使用 GO 进行培训。我正在使用框架 GIN,我需要验证一个像这样的简单结构。它被发布到搜索端点

type SearchData struct {
Field1 string `json:"field1,omitempty"`
Field2 string `json:"field2,omitempty"`
Field3 string `json:"field,omitempty" binding:"alphanum"`
}

第一个问题:我无法查看 if Field3 != nil因为是一个字符串,我通过在线阅读找到的一个解决方案是我可以将它转换为一个指针,问题是我从绑定(bind) alphanum 中得到一个错误,因为 nil 验证失败。

第二个问题:我可以删除 omitempty 检查,但如果我这样做,字母验证器将失败,并且字段设置为默认值“”。我无法检查用户是否要提交“”或者是设置默认值的 bindingJSON 方法。

通过在线阅读,我发现这个问题没有合适的解决方案(或者可能是的),因为我是 GO 的新手,我很高兴看到其他人如何在发布/生产 API 中处理这个问题。

编辑:这就是我解析 json 的方式
func Search(c *gin.Context) {
db := c.MustGet("db").(*mgo.Database)
var json SearchData

if err := c.ShouldBindJSON(&json); err != nil {
fmt.Println(err)
utils.ReturnError400(c, "Invalid")
return
}

// the json is used here
}

最佳答案

如果未提供参数,则 Gin 返回一个空字符串。
您可以使用以下方法来验证是否提供了字符串:

// IsBlank is delegated to verify that the does not contains only empty char
func IsBlank(str string) bool {
// Check length
if len(str) > 0 {
// Iterate string
for i := range str {
// Check about char different from whitespace
if str[i] > 32 {
return false
}
}
}
return true
}

您可以在此存储库中阅读一些有用的 utils 方法,以验证字符串并在字符串上执行常见任务:
https://github.com/alessiosavi/GoGPUtils/blob/master/string/stringutils.go

对于第二个问题,您可以使用 DefaultQuery如果没有提供,为了设置一个预定义的值,这里是一个例子

func get() gin.HandlerFunc {
fn := func(c *gin.Context) {
// firstname will be "NOT_PRESENT" if the user does not send the parameter
firstname := c.DefaultQuery("test", "NOT_PRESENT")
lastname := c.Query("test1")
fmt.Println(firstname, lastname)

}
return gin.HandlerFunc(fn)
}

这里是关于 DefaultQuery 的文档:
https://godoc.org/github.com/gin-gonic/gin#Context.DefaultQuery

关于go - 已发布数据验证的 GIN 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58931239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com