gin怎么自定义中间件解决requestBody不可重复读问题

今天小编给大家分享一下gin怎么自定义中间件解决requestBody不可重复读问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

先直接上代码

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()
	})

注意,上面的中间件,需要在第一个执行。

分析

在gin中,context.Request.Body 是一个io.ReadCloser的接口,如下图

查看io.ReadCloser接口定义

type ReadCloser interface {
	Reader
	Closer
}
type Reader interface {
	Read(p []byte) (n int, err error)
}
type Closer interface {
	Close() error
}

我们发现io.ReaderCloser接口的本质就是Read(p []byte) (n int, err error) 和 Close() error 的组合。

所以我们只需要自己编写实现Read(p []byte) (n int, err error) 和 Close() error 这两个方法的结构体即可赋值给context.Request.Body,在我们自己实现的方法中实现可重复读取即可达到我们的目的。

以上就是“gin怎么自定义中间件解决requestBody不可重复读问题”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注本站行业资讯频道。

相关推荐:

spring mvc中@RequestBody注解的作用是什么

这篇文章主要介绍“spring mvc中@RequestBody注解的作用是什么”,在日常操作中,相信很多人在spring mvc中@RequestBody注解的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spring mvc...

@RequestBody获取POST方式的json字符串

本篇文章给大家分享的是有关@RequestBody获取POST方式的json字符串,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前端写法:varjson_data={ "name":"demographic...

如何正确的使用@RequestBody

本篇文章为大家展示了如何正确的使用@RequestBody,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。基础知识介绍:@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@Reques...

如何使用@RequestParam 与@RequestBody

本篇文章给大家分享的是有关如何使用@RequestParam与@RequestBody,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、@RequestParam   /**   &nb...

Golang Gin局部和全局中间件怎么使用

这篇文章主要介绍了Golang Gin局部和全局中间件怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang Gin局部和全局中间件怎么使用文章都会有所收获,下面我们一起来看看吧。中间件中间件是放在客户端和服务端的中间。 当你的...

Gin框架中bind怎么使用

本篇内容主要讲解“Gin框架中bind怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Gin框架中bind怎么使用”吧!概述Gin框架中,有bind函数可以非常方便的将url的查询参数queryparameter、http的Header,body中...

Gin的安装方法及应用

这篇文章主要介绍“Gin的安装方法及应用”,在日常操作中,相信很多人在Gin的安装方法及应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Gin的安装方法及应用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!  Gin是一个go写的web框架,具有高性能的优点。  ...

如何使用gin接受post的json数据

本篇内容介绍了“如何使用gin接受post的json数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一种func Login(c *gin.Context) { &n...