funcLogger()gin.HandlerFunc{returnfunc(c*gin.Context){// 记录请求时间start:=time.Now()// 打印请求信息reqBody,_:=c.GetRawData()fmt.Printf("[INFO] Request: %s %s %s\n",c.Request.Method,c.Request.RequestURI,reqBody)// 执行请求处理程序和其他中间件函数c.Next()// 记录回包内容和处理时间...
req.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes)) 但是官方的代码注释里却写不需要在处理函数里调用 Close:Request.Body:"The Server will close the request body. The ServeHTTP Handler does not need to." 感觉好奇怪,golang 中 net/http 包的 server 自己能关闭 request,那跟上面类似执行 req.B...
body, _ :=ioutil.ReadAll(c.Request.Body)ifbody !=nil { log.Info("请求body内容为:%s", body) } 此方法即可打印所有请求的body内容,但是在对应的处理器上就取不到数据 解决办法: data,err :=c.GetRawData()iferr !=nil{ fmt.Println(err.Error()) } fmt.Printf("data: %v\n",string(data)...
fmt.Printf("req.body=%s\n, content-type=%v\n", data, c.ContentType()) // 把字节流重新放回 body 中 c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) 1. 2. 3. 4. 参考 Gin框架body参数获取 Gin中间件打印request.Body...
Gin框架body参数获取 需求: 记录所有请求的json数据 body, _ :=ioutil.ReadAll(c.Request.Body)ifbody !=nil { log.Info("请求body内容为:%s", body) } 此方法即可打印所有请求的body内容,但是在对应的处理器上就取不到数据 解决办法: data,err :=c.GetRawData()iferr !=nil{...
整体思路就是给ResponseWriter包一层,用个buffer缓存一下实际写入的内容,最后再打印到log。 照着上面例子,简单实现了个HandlerFunc,验证通过(未在线上使用,仅供参考): const MAX_PRINT_BODY_LEN = 512 type bodyLogWriter struct { gin.ResponseWriter bodyBuf *bytes.Buffer } func (w bodyLogWriter) Write(b ...
bodyBytes, _ := ioutil.ReadAll(c.Request.Body) // 获取header指定字段 headerTest := c.Request.Header.Get("test") for k, v := range c.Request.Header { fmt.Println(k, v) } fmt.Printf("id: %s; page: %s; name: %s; message: %s; header_test:%s; bodyBytes:%s", id, page, nam...
首先,无需在每次调用 `GenerateRequestBody` 时都关闭 `c.Request.Body`,但需注意 `bytes.NewBuffer` 的资源消耗,考虑使用 `sync.pool` 缓存这一操作以减少创建次数。实际上,由于上下文 (`Context`) 的绑定特性,可以在 `Context` 创建时获取 `sync.pool` 对象,然后在 `Context` 销毁前归还,...
package mainimport ("bytes""fmt""github.com/gin-gonic/gin""io/ioutil")func main() {router := gin.Default()router.POST("/test", func(c *gin.Context) {// 打印出 bodydata, _ := ioutil.ReadAll(c.Request.Body)fmt.Printf("req.body=%s\n, content-type=%v\n", data, c.ContentType...
本篇文章是 gin 源码分析系列的第二篇,这篇文章我们主要弄清一个问题:一个请求通过 net/http 的 ...