go - 当我重定向初始请求时如何在 Gin 中记录响应正文

标签 go go-gin

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

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())
		}
 }

不幸的是, body react 总是空的。也许重定向或中间件扰乱了我的 body react

当我尝试使用 postman 时,我可以看到 body 响应即将到来!您可以通过 POST https://jsonplaceholder.typicode.com/posts 来尝试。 。它应该在正文响应中返回一个带有 id 的有效负载

我在这里做错了什么?

提前致谢

最佳答案

您在浏览器/ postman 中看到的响应正文来自您重定向到的页面。。执行实际重定向的页面可能没有响应正文,只有状态和 Location header 。这是重定向的预期行为。如果您想 try catch 要重定向到的页面的正文,则实际上不能使用重定向(最终请求中不涉及重定向处理程序);您必须完全代理请求而不是重定向它。不过,代理与重定向有很大不同,因此请确保这确实是您所追求的行为。

关于go - 当我重定向初始请求时如何在 Gin 中记录响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52333118/

相关文章:

go - 如何在HTTP请求后使用pprof查看Web服务器的内存使用情况

go - 按分钟截断持续时间

go - 为什么在解码后我得到不同的字节数但在编码后得到相同的结果?

go - 当多个结构体在 golang 中有几个共同的功能时,最佳实践是什么

go - 如何将 yaml 键映射到 golang 中的结构?

Golang 的 GIN 中的 JSON 响应作为乱码数据返回

Golang 无法在同一个包中进行测试

go - 我可以通过 Golang 将图像上传到 Imgur 吗

go - 如何使用 gin 框架将文件上传到 amazon s3

testing - Golang 中的模拟函数来测试我的 http 路由