请务必检查,是否调用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})
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐