KING 博主等级

一帆风顺 ⛵️⛵️⛵️

Go

gin.Context 进行数据绑定报错EOF

钟晓川
2024-08-02 / 0 点赞 / 590 阅读

ShouldBind在重复调用的情况下出现EOF的报错,这个问题的原因出现在ShouldBind在第一次调用时已经读取并消耗了request.Body中的数据,当再次调用ShouldBind时,由于request.Body中的数据已经被读取完毕,因此没有数据可读,从而返回EOF错误。

多次调用ShouldBind方法来绑定请求数据到多个结构体,第二次调用就出现了EOF报错

var menuParam menuService.UpdateFuncMenuRequest
if err := ctx.ShouldBind(&menuParam); err != nil {
  // handle error 
}

var routeMetaParam menuService.UpdateRouteMetaRequest
if err := ctx.ShouldBind(&routeMetaParam); err != nil {
  // handle error 
}

针对以上问题的解决方法,在这种场景下,使用ShouldBindBodyWith来替代ShouldBind,ShouldBindBodyWith在调用之前,先将request.Body的数据读取出来,然后在ShouldBindBodyWith调用之后重新设置回去

var menuParam menuService.UpdateFuncMenuRequest
if err := ctx.ShouldBindBodyWith(&menuParam, binding.JSON); err != nil {
  // handle error
}

var routeMetaParam menuService.UpdateRouteMetaRequest
if err := ctx.ShouldBindBodyWith(&routeMetaParam, binding.JSON); err != nil {
  // handle error
}

还可以使用GetRawData方法,gin提供了GetRawData方法来获取原始的请求数据,这样你可以在之后重复使用这些请求数据

data, err := ctx.GetRawData()
if err != nil {
  // handle error
}
var menuParam menuService.UpdateFuncMenuRequest
if err := json.Unmarshal(data, &menuParam); err != nil {
  // handle error
}

var routeMetaParam menuService.UpdateRouteMetaRequest
if err := json.Unmarshal(data, &routeMetaParam); err != nil {
  // handle error
}
0
Go