调用ShouldBind()绑定json时报错:EOF
·
请务必检查,是否调用ShouldBind()或者读取请求体不止一次!
HTTP 请求的请求体通常只能被读取一次。在某些情况下,比如在调用 c.GetRawData() 或 c.ShouldBind() 之前,如果提前读取了请求体,那么后续再次读取时就会得到一个空的内容,因为它已经被消耗掉了。
所以我们在每次bind前,都得重置一次请求体。
func callbackHandler(c *gin.Context) {
var req1 CallbackReq1
var req2 CallbackReq2
// 读取请求体并重置
body, err := c.GetRawData()
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 重置请求体以便第一次绑定
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
// 使用 ShouldBindJSON 绑定到第一个结构体
if err := c.ShouldBindJSON(&req1); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 重置请求体以便第二次绑定
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
// 使用 ShouldBindJSON 绑定到第二个结构体
if err := c.ShouldBindJSON(&req2); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 返回绑定后的数据
c.JSON(http.StatusOK, gin.H{"req1": req1, "req2": req2})
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)