gin框架shouldbind方法解析及多重绑定问题
在使用gin框架进行参数绑定时,开发者经常会用到shouldbind方法。然而,在某些情况下,shouldbind方法可能会出现一些意想不到的问题。本文将针对一个具体的案例,分析shouldbind方法在多重绑定时的行为,并提供解决方案。
问题描述:
代码片段中定义了一个结构体listreqinfo,用于接收前端post请求的参数。使用gin.context的shouldbind方法绑定请求体到listreqinfo结构体和map[string]interface{}。当同时使用c.shouldbind(¶m)和c.shouldbind(¶mmap)时,只有先执行的shouldbind方法能成功绑定参数,后执行的shouldbind方法则无法获取参数值。如果注释掉其中任意一行,则另一行可以正常工作。
代码如下:
- // package modelstype ListReqInfo struct { Keyword string `form:"keyword" default:""` //模糊关键字 PageNum int `form:"pageNum" binding:"required" default:"1"` //页数 PageSize int `form:"pageSize" binding:"required" default:"10"` //页大小 OrderName string `form:"orderName" default:"created_on"` //排序列 OrderType string `form:"orderType" default:"desc"` //排序方式 desc asc}// @Tags 文章// @Summary 分页获取文章// @Produce json// @Param ReqInfo body models.ListReqInfo false "info"// @Success 200 {object} app.Response// @Failure 500 {object} app.Response// @Router /api/v1/article/list [post]func (a Article) List(c *gin.Context) { var ( appG = app.Gin{C: c} param models.ListReqInfo paramMap map[string]interface{} ) c.ShouldBind(¶m)//代码1 c.ShouldBind(¶mMap)//代码2 jsonData, _ := c.GetRawData()//代码3也获取不到值}
登录后复制
问题原因分析:
c.shouldbind 方法从请求体读取数据并进行绑定。在第一次调用c.shouldbind(¶m)后,请求体的数据已经被读取并消耗。第二次调用c.shouldbind(¶mmap)时,请求体已经为空,因此无法绑定数据。
解决方案:
为了解决这个问题,可以使用c.shouldbindbodywith(¶m, binding.json)方法。这个方法可以避免请求体被消耗的问题,确保多次绑定都能成功。shouldbindbodywith方法会将请求体缓存到上下文中,因此可以重复使用而不会出现数据丢失的情况。
通过使用c.shouldbindbodywith(¶m, binding.json),可以有效解决shouldbind方法在多重绑定时遇到的问题,确保所有参数都能正确绑定。
以上就是Gin框架ShouldBind方法多重绑定失效:如何同时绑定结构体和map?的详细内容,更多请关注【创想鸟】其它相关文章!