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