一。问题出现:
因为特定需求,需要多次解析body.
二。研究过程。
1.原生的golang中,可以复制一次body,然后将body传递下去,不过需要注意的是,这里会复制你的body,内存消耗你得考虑到,不然你在做一个大文件传输,比如视频下载之类的东西,这个消耗可不是服务器能吃得下的。
bodyBytes, _ := ioutil.ReadAll(req.Body)
req.Body.Close() // must close
req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
2.然后来看看iris框架中的应用
一般的post解析json他是这么写的
if err := ctx.ReadJSON(&msg); err != nil {
ctx.JSON(iris.Map{"success": false})
return
}
然后我就试试能不能获取两次,由于业务需求,需要先获取一部分处理后,再进行下一步处理
if err := ctx.ReadJSON(&msg); err != nil {
ctx.JSON(iris.Map{"success": false})
return
}
if err := ctx.ReadJSON(&data); err != nil {
ctx.JSON(iris.Map{"success": false})
return
}
这里就报错了,json解析失败。
查了一下资料发现,在文档中发现了这么一句话。这句话来自于iris的官方文档中的“前置自定义读取请求数据数据处理”一章的内容其中一条注释中,写的真的小,怕被发现还是怎么滴。
//你应该通过`app.Run(...,iris.WithoutBodyConsumptionOnUnmarshal)消费body
然后怀着忐忑的心情去试试咯,
在原来的app.run语句中,在参数中加入了这个后面这个东西。
if err := app.Run(iris.Addr(":8080"), iris.WithPostMaxMemory(maxSize), iris.WithoutBodyConsumptionOnUnmarshal); err != nil {
panic(err)
}
重新去请求,发现成了,哎,真心累。
解释:上面这个东西,需要在你监听函数app.run内部加一个参数,就是“WithoutBodyConsumptionOnUnmarshal”,这样,你里面的post请求就可以二次获取。如果本来你就有其他的参数,加在后面就好了,亲测有效,如果有疑问,或者见解,请@我,谢谢
有疑问加站长微信联系(非本文作者)