重定向初始请求时如何在杜松子酒中记录响应主体

我正在尝试记录已重定向的请求的响应正文。


func main() {

  r := gin.Default()


  eanAPI := api.NewEanAPI()


  v1 := r.Group("/v1")

  v1.POST("/*action", eanAPI.Redirect, middleware.SaveRequest())

  

  

  port := os.Getenv("PORT")

  if len(port) == 0 {

    port = "8000"

  }

  r.Run(":" + port)

}


func (api *eanAPI) Redirect(ctx *gin.Context) {

  forwardToHost := "https://jsonplaceholder.typicode.com"

  url := ctx.Request.URL.String()

  ctx.Redirect(http.StatusTemporaryRedirect, forwardToHost)

}


type bodyLogWriter struct {

  gin.ResponseWriter

  body *bytes.Buffer

}


func (w bodyLogWriter) Write(b []byte) (int, error) {

  w.body.Write(b)

  return w.ResponseWriter.Write(b)

}


func SaveRequest() gin.HandlerFunc {

  return func(c *gin.Context) {

    c.Next()

    blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer}

    c.Writer = blw

    c.Next()

    statusCode := c.Writer.Status()

    fmt.Println("status: ", statusCode)

    if statusCode <= 400 {

      //ok this is an request with error, let's make a record for it

      // now print body (or log in your preferred way)

      fmt.Println("Response body: " + blw.body.String())

    }

 }

不幸的是,身体的反应总是空洞的。也许是重定向或中间件扰乱了我的身体反应

当我尝试邮递员时,我可以看到身体反应来了!您可以在https://jsonplaceholder.typicode.com/posts上通过 POST 尝试。它应该在正文响应中返回一个带有 id 的有效负载

我在这里做错了什么?

提前致谢


牛魔王的故事
浏览 71回答 1
1回答

慕工程0101907

您在浏览器/邮递员中看到的响应正文来自您被重定向到的页面。执行实际重定向的页面可能没有响应主体,只有状态和Location标头。这是重定向的预期行为。如果您想尝试捕获要重定向到的页面的主体,您实际上不能为此使用重定向(最终请求中不涉及重定向处理程序);您必须完全代理请求而不是重定向它。代理与重定向有很大不同,因此请确保这确实是您所追求的行为。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go