c.BindJSON带有可选参数

时间:2016-10-03 07:46:02

标签: rest go

我正在使用go-gin并尝试实现PATCH API。 3个字段是可编辑的,所以我有一个像这样定义的结构

type Person struct {
    Name         string  `form:"name" json:"name" binding:"required"`
    Account      string  `form:"account" json:"account" binding:"required"`
    PrimaryOwner string  `form:"primary_owner" json:"primary_owner" binding:"required"`
}

我试图像这样绑定json:

var json Person
if c.BindJSON(&json) == nil {
        fmt.Println("json matched!!!!!!!")
    }else {
        fmt.Println("json not matched!!!!!!!")
}

问题是它试图绑定所有参数。如果我给出所有参数它会匹配,但即使缺少一个参数,它也会进入else块。在补丁API中我不想强制绑定。如果我从所有字段中删除binding:"required",它总是匹配,即使我提供了一些像sdfsdfsdf这样的密钥。如何绑定所有参数但不能全部绑定。应验证json请求体中的密钥,但不应同时需要所有密钥。

1 个答案:

答案 0 :(得分:0)

只是发现这个问题没有得到答案。

因此,您想绑定所有参数,并且最少需要一个

  

如何绑定到所有参数,但不能绑定到所有参数。

您几乎在这里回答了您的问题:

  

如果我从始终匹配的所有字段中删除绑定:“ required”

所以我将删除必填项并检查每个值。

var json Person
if err := c.BindJSON(&json); err != nil {
        // error handling here
        // something went wrong
    }
    if json.Name == "" && json.Account == "" && json.PrimaryOwner  == "" {
        // no key is given... 
    }
}