Как записать тело ответа в джин, пока я перенаправляю первоначальный запрос - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь зарегистрировать тело ответа на запрос, который был перенаправлен.

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 Ответ

0 голосов
/ 14 сентября 2018

Тело ответа, которое вы видите в браузере / почтальоне, находится со страницы, на которую вы перенаправляетесь на .На странице, выполняющей фактическое перенаправление, скорее всего, нет тела ответа, только статус и заголовок Location.Это ожидаемое поведение перенаправления.Если вы хотите попытаться захватить тело страницы, на которую вы перенаправляете, вы не можете использовать перенаправления для этого (обработчик перенаправления не участвует в окончательном запросе);вам придется полностью прокси-запрос, а не перенаправлять его.Прокси-сервер сильно отличается от перенаправления, поэтому убедитесь, что это действительно то поведение, которое вам нужно.

...