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()
})
// 注册中间件,使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()
})
© 版权声明
文章版权归作者所有,未经允许请勿转载。