gpt4 book ai didi

go - 确定 POST 数据值是否匹配结构字段类型

转载 作者:IT王子 更新时间:2023-10-29 02:23:56 26 4
gpt4 key购买 nike

使用 gin 框架,我试图确定 POST 数据是否与结构字段类型不匹配,并通知 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 数据(作为字符串传递)是否与它绑定(bind)到的结构字段 (int) 不匹配。如果数据不匹配,我想向用户发回消息。出于这个原因,我希望我可以遍历 gin 上下文数据并检查它。

gin 函数“c.Bind()”似乎忽略了无效数据和所有后续数据字段。

最佳答案

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

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

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

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"`

注意这个:绑定(bind):“required,min=1”

然后:

err := c.Bind(&json)

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

更新:

三种解决方法:

  • 验证你自己的 json 字符串(不能用 enconding/json 完成)
  • 验证整数是否大于 0 binding:"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,
    }
    }

关于go - 确定 POST 数据值是否匹配结构字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30691905/

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