【问题标题】:GIN problems with posted data validation已发布数据验证的 GIN 问题
【发布时间】:2019-11-19 21:42:50
【问题描述】:

我目前正在学习 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,因为它是一个字符串,我通过在线阅读找到的一个解决方案是我可以将它转换为指针,问题是我从绑定字母中得到一个错误,因为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
}

【问题讨论】:

  • 我在这里发布结构之前更改了它们,它们都以我的代码中的大写开头
  • 是我目前面临的问题的通用示例,字段名称目前不相关,但我将修复问题中的命名谢谢

标签: go go-gin


【解决方案1】:

如果没有提供参数,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

【讨论】:

  • 我无法访问 IsBlank 函数,因为每次我发布没有 field3 关键字的 json 时,无论有没有 omitempty,我都会收到错误 Key: 'SearchData.field3' Error:Field validation for 'field3' failed on the 'alphanum' tag
  • 等一下,请分享您如何检索参数以及如何通过 curl 发送它们
  • 这里不能贴太长的代码sn-p,我在问题最后加了
猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 2021-11-19
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多