首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gin gonic绑定多个参数(query + json)

gin gonic绑定多个参数(query + json)
EN

Stack Overflow用户
提问于 2021-10-20 06:43:24
回答 1查看 606关注 0票数 -1

在gin gonic中有没有一种方法可以干净利落地组合绑定,或者像BindAll这样的东西。在我的例子中,我同时有query和json参数,所以绑定/BindJSON和BindQuery。如果我一直理解到这里,绑定必须一个接一个地使用,这使得代码变得混乱。不幸的是,即使在大量的谷歌搜索之后,我也没有找到任何合理的东西(示例仅限于一种类型)。示例:

代码语言:javascript
运行
复制
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()})
    }

}

呼叫:

代码语言:javascript
运行
复制
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"}'

期望如下所示:

代码语言:javascript
运行
复制
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()})
}
EN

回答 1

Stack Overflow用户

发布于 2021-10-20 08:01:36

代码语言:javascript
运行
复制
  // 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不能做“组合绑定”,“content-type”会告诉它如何绑定数据。如果你想正确解析查询参数,就不能使用c.Query来获取user_id参数。

代码语言:javascript
运行
复制
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()})
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69641408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档