gin自定义中间件解决requestBody不可重复读问题(最新推荐)(egg中间件)深度揭秘

随心笔谈2年前发布 admin
200 0 0

文章摘要

这篇文章介绍了如何优化使用 Gin 中间的件(interceptors)来处理 HTTP 请求的 body 数据。文章的核心内容在于通过注册中间件,使得在处理 body 时可以重复读取 raw data,并将其缓存起来供后续操作使用。具体来说,作者在代码中实现了以下几点: 1. 使用中间件注册函数,读取 raw data 并将其存储在变量 all 中; 2. 重写了 GetBody 方法,使得后续的 GetBody 调用不再需要再次读取 raw data,而是直接使用缓存的 body 数据; 3. 在每次调用 GetBody 方法时,会生成一个新的读取闭包(io.ReadCloser),但底层的 body 数据由 all 变量统一缓存,避免重复处理。 这种方法能够提高处理 body 数据的效率,尤其是在频繁调用 GetBody 方法的情况下,能够显著减少重复读取 raw data 的开销。

r :=gin.Default()
// 注册中间件,使body可以重复读取
r.Use(func(context *gin.Context) {
all, err :=context.GetRawData() // 读取body的内容
if err !=nil {
log.Fatal(err)
}
// 重写 GetBody 方法,以便后续的其他操作
context.Request.GetBody=func() (io.ReadCloser, error) {
context.Request.Body=io.NopCloser(bytes.NewBuffer(all))
buffer :=bytes.NewBuffer(all)
closer :=io.NopCloser(buffer)
return closer, nil
}
body, _ :=context.Request.GetBody() // 每次调用GetBody方法,都会新生成一个io.ReadCloser,但是底层的byte数据,都是all变量缓存的。
context.Request.Body=body
context.Next()
})

© 版权声明

相关文章