一、在Gin框架中打印request body
前面有篇文章介绍了,通过在中间件中读取body的内容,然后在打印,最后在通过ioutil.NopCloser把读取的内容从新赋值给body,解决只能读一次问题。
下面介绍另一种方式,避免多次Unmarshal和内存拷贝。
二、使用gin.Context的set和get方法
1.方法处理结束后调用c.Set要打印的值
func LoginHandler(c *gin.Context){
// 假设loginDTO是接收POST方法传递的参数
var loginDTO LoginDTO
var err error
// Unmarshal参数到loginDTO
if err = c.ShouldBindJSON(&loginDTO);err!=nil{
// TODO 这里返回自定义的错误提示,代码省略若干行。。。
return
}
// 解析成功,则把用户参数set到params中
defer c.Set("params",loginDTO)
return
}
2.在非业务中间件中调用c.Get获取要打印的值
func LoggerMiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
// 此处省略若干行。。。
// 注意:在Next之前不读取body的内容
c.Next()
params:=c.Get("params")
// 自定义打印,此处只是简单举例
log.Printf("Request params:%v",params)
}
}
总结
本文通过gin.Context对象的Set和Get方法以及中间件的使用,优雅的完成了请求参数的打印功能,避免在每个业务方法中打印请求参数的问题,同时避免使用ioutil.NopCloser需要赋值一次内存的方式。