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

背景

参考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)

如果你在使用Go语言的Gin框架时没有进入`sockjs.NewHandler`处理程序,可能是由于路由配置不正确导致的。以下是一个示例代码,演示如何在Gin正确配置SockJS处理程序: ```go package main import ( "log" "net/http" "github.com/gin-gonic/gin" "github.com/igm/sockjs-go/sockjs" ) func main() { // 创建Gin路由引擎 router := gin.Default() // 创建SockJS处理程序 handler := sockjs.NewHandler("/sockjs", sockjs.DefaultOptions, echoHandler) // 设置路由和处理程序 router.GET("/sockjs/*any", gin.WrapH(handler)) router.GET("/", homeHandler) // 启动HTTP服务器 err := router.Run(":8080") if err != nil { log.Fatal("Server start failed:", err) } } // 处理SockJS连接的函数 func echoHandler(session sockjs.Session) { for { if msg, err := session.Recv(); err == nil { // 处理接收到的消息,并发送回复 err := session.Send(msg) if err != nil { log.Println("Send message failed:", err) break } } else { log.Println("Receive message failed:", err) break } } } // 处理主页的函数 func homeHandler(c *gin.Context) { c.String(http.StatusOK, "Welcome to the homepage!") } ``` 在上述代码,我们使用了Gin框架来构建Web应用。首先,创建了一个Gin路由引擎。然后,创建了SockJS处理程序,并将其包装为Gin的处理器函数(使用`gin.WrapH`函数)。接下来,我们使用`router.GET`方法来设置SockJS的路由。注意,这里的路由路径需要匹配SockJS的URL模式,可以使用`/*any`通配符来匹配任意路径。同时,我们还设置了处理主页的路由。 最后,调用`router.Run`启动HTTP服务器,并监听在8080端口上。 确保将SockJS处理程序正确绑定到路由上,以便在访问该路径时能够进入SockJS处理程序。在示例,我们使用了`/sockjs/*any`作为SockJS的路由。 在你的实际代码,你可能需要根据需求进行适当的修改和扩展。确保SockJS处理程序的路由配置正确,以便进入`sockjs.NewHandler`处理程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值