请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

gin 如何打印请求的入参与返回

打印本次请求的入参可以在中间件中 all, err := ioutil.ReadAll(c.Request.Body)
这样获取
但是 response 就没办法拿到
c.next()
readAll, err := ioutil.ReadAll(c.Request.Response.Body)
这样直接报错 response 对象是 nil
有好的办法吗?

正在回答

3回答

bobby 2021-03-13 10:33:33

这里和我刚才提到的是一样的 你的第一个readAll, err := ioutil.ReadAll(c.Request.Response.Body)可以运行,第二次就不行了,因为第一次读取后会被清空,这有点坑

0 回复 有任何疑惑可以回复我~
  • 提问者 Anthony_Duan #1
    不对呀 ,第一次读取的是c.Request.Body 第二次读的是c.Request.Response.Body;不是一个东西;而且我刚才注释掉上面的还是不行
    回复 有任何疑惑可以回复我~ 2021-03-13 10:35:56
  • 提问者 Anthony_Duan #2
    入参采集果然也是也有问题;body 只能读一次;如果中间件读取了;后面就没了。。。这有好的方法统一打印这种入参与返回的信息吗?
    回复 有任何疑惑可以回复我~ 2021-03-13 10:49:05
  • 提问者 Anthony_Duan #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2021-03-13 11:47:30
提问者 Anthony_Duan 2021-03-13 10:12:40

func Resp() gin.HandlerFunc {
  return func(c *gin.Context) {

     all, err := ioutil.ReadAll(c.Request.Body)
     if err != nil {
        panic(err)
     }
     //请求的 body 可以获取
     fmt.Println(string(all))
     c.Next()
     //接下来这行报错
     readAll, err := ioutil.ReadAll(c.Request.Response.Body)
     if err != nil {
        panic(err)
     }
     fmt.Println(string(readAll))
  }
}

func main() {
  r := gin.Default()
  r.Use(Resp())
  r.POST("/test",test)
  //r.GET("/login/:username/:password", login)
  //r.GET("/verify/:token", verify)
  //r.GET("/refresh/:token", refresh)
  //r.GET("/sayHello/:token", sayHello)
  _ = r.Run(":8000")
}

func test(c *gin.Context) {
  resp := struct {
     A int `json:"a"`
     B string `json:"b"`
  }{
     A: 500,
     B: "600",
  }
  //c.JSONP(http.StatusOK, resp)
  c.JSON(http.StatusOK,resp)
  fmt.Println("500")
}

0 回复 有任何疑惑可以回复我~
bobby 2021-03-13 10:07:43

你的完整代码截图我看看 gin中有点变态的是如果你之前已经通过其他方法读取过这里的值了那么下一次你再读取就没有了

0 回复 有任何疑惑可以回复我~
  • 提问者 Anthony_Duan #1
    func Resp() gin.HandlerFunc {
    	return func(c *gin.Context) {
    
    		all, err := ioutil.ReadAll(c.Request.Body)
    		if err != nil {
    			panic(err)
    		}
    		//请求的 body 可以获取
    		fmt.Println(string(all))
    		c.Next()
    		//接下来这行报错
    		readAll, err := ioutil.ReadAll(c.Request.Response.Body)
    		if err != nil {
    			panic(err)
    		}
    		fmt.Println(string(readAll))
    	}
    }
    
    func main() {
    	r := gin.Default()
    	r.Use(Resp())
    	r.POST("/test",test)
    	//r.GET("/login/:username/:password", login)
    	//r.GET("/verify/:token", verify)
    	//r.GET("/refresh/:token", refresh)
    	//r.GET("/sayHello/:token", sayHello)
    	_ = r.Run(":8000")
    }
    
    func test(c *gin.Context) {
    	resp := struct {
    		A int `json:"a"`
    		B string `json:"b"`
    	}{
    		A: 500,
    		B: "600",
    	}
    	//c.JSONP(http.StatusOK, resp)
    	c.JSON(http.StatusOK,resp)
    	fmt.Println("500")
    }
    回复 有任何疑惑可以回复我~ 2021-03-13 10:12:24
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信