确定 POST 数据值是否匹配结构字段类型
Determine if POST data value matches struct field type
使用 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)
所以当我POST
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()' 似乎省略了无效数据和所有后续数据字段。
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,
}
}
使用 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)
所以当我POST
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()' 似乎省略了无效数据和所有后续数据字段。
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, } }