golang iris 多次消费body

aside section._1OhGeD · · 1863 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一。问题出现:
因为特定需求,需要多次解析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请求就可以二次获取。如果本来你就有其他的参数,加在后面就好了,亲测有效,如果有疑问,或者见解,请@我,谢谢


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:aside section._1OhGeD

查看原文:golang iris 多次消费body

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1863 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传