首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在重定向初始请求时在gin中记录响应体

问如何在重定向初始请求时在gin中记录响应体
EN

Stack Overflow用户
提问于 2018-09-14 13:32:13
回答 1查看 1.6K关注 0票数 1

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

​

代码语言:javascript
复制
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上的帖子进行尝试。它应该返回主体响应中带有id的有效负载。

我在这里做错什么了?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-14 13:51:44

在浏览器/邮递员中看到的响应体来自被重定向到的页面。执行实际重定向的页面可能没有响应体,只有一个状态和一个Location头。这是重定向的预期行为。如果您想要捕获要重定向到的页面的主体,实际上不能为此使用重定向(重定向处理程序不涉及最终请求);您必须完全代理请求,而不是重定向它。代理和重定向有很大的不同,所以要确保这就是你想要的行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52333118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档