调用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})
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值