Как записать тело ответа в джин, пока я перенаправляю первоначальный запрос
Я пытаюсь зарегистрировать тело ответа на запрос, который был перенаправлен.
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())
}
}
К сожалению, реакция тела всегда пуста. Возможно, перенаправление или промежуточное программное обеспечение портят реакцию моего тела
Когда я попробовал с почтальоном, я вижу, как идет реакция тела! Вы можете попробовать это через POST на https://jsonplaceholder.typicode.com/posts. Он должен возвратить полезную нагрузку с идентификатором в теле ответа
Что я здесь не так делаю?
заранее спасибо
1 ответ
Тело ответа, которое вы видите в браузере / почтальоне, находится со страницы, на которую вы перенаправлены. Страница, выполняющая фактическое перенаправление, скорее всего, не имеет тела ответа, только статус и Location
заголовок. Это ожидаемое поведение перенаправления. Если вы хотите попытаться захватить тело страницы, на которую вы перенаправляете, вы не можете использовать перенаправления для этого (обработчик перенаправления не участвует в окончательном запросе); вам придется полностью прокси-запрос, а не перенаправлять его. Прокси сильно отличается от перенаправления, поэтому убедитесь, что это действительно то поведение, за которым вы следите.