Golang多次读取Request的Body
Golang中间件多次读取Request的Body
问题描述
在用echo写中间件的时候需要提取Body的内容进行验证,但是Body是一个io.ReadCloser,即要求实现Read()和Close()方法的interface,也就是说也是个Reader接口,而Reader接口读完就没了,类似于从TCP流中读数据那样。如果中间件把Body读完了的话,后面的handler就没法读了。
看Request结构体的源码看到里面有个GetBody成员,是个函数,该函数返回Body的副本,但是试了一下发现会报错,非法的内存什么的,网上有人说这个是用在客户端的,不是用在服务端的,没在客户端试过。
然后源码里面NewRequestWithContext函数中给GetBody赋值时GetBody函数中是通过ioutil.NopCloser来创建Request的,而ioutil.NopCloser结构体中实现的Close()函数实际上啥也不做,直接返回nil,所以关闭Body到底有啥用?
stackoverflow也有人提这个问题。
解决方案
后来在stackoverflow找到了解决方案 ,先把body读出来,再重新给Request写入一个body。简单的代码如下:
| |
至于用不用关闭Body以及关闭了有什么效果还需要后面再了解(按道理来讲应该是需要关闭的,因为实现了Closer接口,但Body又是个ioutil.NopCloser,其Close()函数不做任何事情)。