[go] Gin中间件中获取request.body

本文介绍如何在Gin框架中处理HTTP请求时,避免因Request.Body的单次使用特性导致的问题,通过创建新的缓冲区替换原有Body,实现多次读取。分享了Stackoverflow上的解决方案并适用于其他框架如Beego的实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

参考issue

线上有个中间件开发需求,需要对请求内容进行部分过滤。由于默认http.Request.Body类型为io.ReadCloser类型,即只能读一次,读完后直接close掉,后续流程无法继续读取。这对于在http handler之前需要对body进行处理就带来了麻烦。实际上针对这种需求,其他框架有自己的解决方案。 在beego中开启 beego.BConfig.CopyRequestBody = true后,Controller对应gin的Context中即包含了request.body的拷贝值,可以直接在中间件和Handler中传递。
但是Gin实际上并未提供该功能,issue中的GetRawBody本质也未能解决这个问题。
最后在stackoverflow找到问题解决方案,在这里做个记录,how-to-get-the-json-from-the-body-of-a-request-on-go
> ps:该解决方案同样适用于http原生路由http.ServeMux处理方法。

解决方案

解决思路: 由于 Request.Body 为公共变量,我们在对原有的buffer读取完成后,只要手动创建一个新的buffer然后以同样接口形式替换掉原有的Request.Body即可。

GIN 已经实现:

	var body interface{}
	if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil {
		log.Default().Error("should bind body error", zap.Error(err))
	}

	bodyStr, _ := json.MarshalToString(body)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值