确定POST数据值是否与struct字段类型匹配

时间:2015-06-07 09:19:22

标签: go go-gin

使用gin框架我试图确定POST的数据是否与struct字段类型不匹配,并告知API用户他们的错误。

type CreateApp struct {
    LearnMoreImage string `db:"learn_more_image" json:"learn_more_image,omitempty" valid:"string,omitempty"`
    ApiVersion     int64  `db:"api_version" json:"api_version" valid:"int,omitempty"`
}
...
func CreateApps(c *gin.Context) {
    var json models.CreateApp
    c.Bind(&json)

所以当我发布

curl -H "Content-Type: application/json" -d '{"learn_more_image":"someimage.jpg","api_version":"somestring"}' "http://127.0.0.1:8080/v1.0/apps"

我想确定字段'api_version'的POST数据(作为字符串传递)是否与绑定到(int)的结构字段不匹配。如果数据不匹配,我想向用户发送消息。由于这个原因,我希望我可以遍历杜松子酒上下文数据并检查它。

gin函数'c.Bind()'似乎省略了无效数据及其随后的所有数据字段。

1 个答案:

答案 0 :(得分:0)

Gin有一个内置的验证引擎:https://github.com/bluesuncorp/validator/blob/v5/baked_in.go

但你可以自己使用或完全禁用它。

验证器不验证有线数据(json字符串),而是验证绑定结构:

LearnMoreImage string `db:"learn_more_image" json:"learn_more_image,omitempty" binding:"required"`
ApiVersion     int64  `db:"api_version" json:"api_version" binding:"required,min=1"`

请注意:绑定:“required,min = 1”

然后:

err := c.Bind(&json)

或使用中间件并阅读c.Errors

更新:

三种解决方法:

  • 验证您自己的json字符串(使用enconding / json无法完成)
  • 验证整数是否为> 0绑定:“min = 1”
  • 使用map [string] interface {}而不是Struct,然后验证类型。

    func endpoint(c *gin.Context) {
        var json map[string]interface{}
        c.Bind(&json)
        struct, ok := validateCreateApp(json)
        if ok { /** DO SOMETHING */ }
    }
    
    func validateCreateApp(json map[string]interface{}) (CreateApp, bool) {
        learn_more_image, ok := json["learn_more_image"].(string)
        if !ok {
            return CreateApp{}, false
        }
        api_version, ok = json["api_version"].(int)
        if !ok {
            return CreateApp{}, false
        }
        return CreateApp{
            learn_more_image, api_version,
        }
    }