绑定多个参数(query + json)



是否有一种方法可以干净地组合绑定,或者类似于BindAll的方法。在我的情况下,我有查询和json参数,所以绑定/BindJSON和BindQuery。如果我理解到这里,绑定必须一个接一个地使用,这使得代码令人困惑。不幸的是,即使在谷歌上搜索了很多之后,我也没有找到任何合理的东西(这些例子只是局限于一种类型)。例子:

type Params struct {
Userid string `form:"user_id" json:"user_id" query:"user_id" binding:"required"`
Password string `json:"password" binding:"required"`
}

func Create(c *gin.Context) {
var params Params
if err := c.ShouldBind(&params); err == nil {
log.Println("GOOD1")
log.Println(params)
} else {
log.Println("ERROR1")
log.Println(params)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
if err := c.ShouldBindQuery(&params); err == nil {
log.Println("GOOD2")
log.Println(params)
} else {
log.Println("ERROR2")
log.Println(params)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}

调用:

curl -X POST http://0.0.0.0:8080/v1/receipt?user_id=123 -H "Content-Type:application/json" -d '{"login":"my_login","password":"my_password"}'

期待这样的事情:

if err := c.ShouldBindAll(&params); err == nil {
log.Println("GOOD1")
log.Println(params)
} else {
log.Println("ERROR1")
log.Println(params)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
// If `GET`, only `Form` binding engine (`query`) used.
// If `POST`, first checks the `content-type` for `JSON` or `XML`, then uses `Form` (`form-data`).
// See more at https://github.com/gin-gonic/gin/blob/master/binding/binding.go#L48
if c.ShouldBind(&person) == nil {

gin不能执行'combine bindings', 'content-type'会告诉它如何绑定数据。如果您想正确解析查询参数,则不能使用c.Query来获取user_id参数。

var params Params
if err := c.ShouldBind(&params); err == nil {
log.Println("GOOD1")
params.UserId = c.Query("user_id")
log.Println(params)
} else {
log.Println("ERROR1")
log.Println(params)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}