问题出现
今天在写了个中间件,判断权限问题之后接口一直返回
{
"code": "invalid_param",
"message": "Invalid JSON data: EOF"
}
问题排查
造成原因是 MiddleWare中我读取了Request Body中的参数来进行鉴权但是
Go语言的http.Request.Body是一个io.ReadCloser接口类型,它允许你从HTTP请求体中读取数据。Body的设计和使用方式在某些场景下会有特定的设计考虑。理解这个设计背后的原因可以帮助你更好地编写健壮的中间件和处理函数。
- 一次性读取的设计 http.Request.Body本质上是一个流(stream),它允许从客户端发送的数据中顺序读取字节。由于流的性质,Body的内容只能被读取一次。当你从Body中读取数据后,流的光标已经移动到末尾,再次读取将返回EOF(即流结束)。这是因为Body在设计上就是为了减少内存占用,并且符合流式处理的惯用模式(流式处理就是一次读取一点数据,而不是把所有数据都放到内存中)。
# 解决方案
- 提前存入变量
bodyBytes, err := io.ReadAll(c.Request.Body)
- 在使用完之后
// reset context reader to the beginning
c.Request.Body = io.NopCloser(bytes.NewReader(bodyBytes))