Вам нужно перехватить письмо ответа и сначала сохранить его где-нибудь. Затем вы можете его зарегистрировать. И для этого вам нужно реализовать свой собственный Writer, перехватывающий вызовы Write().
Например, следующим образом:
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 ginBodyLogMiddleware(c *gin.Context) {
blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer}
c.Writer = blw
c.Next()
statusCode := c.Writer.Status()
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())
}
}
Затем используйте эту промежуточное программное обеспечение, как это:
router.Use(ginBodyLogFilter)
Обратите внимание, что этот подоконник не будет работать для статических файлов, как джин, кажется, не использовать гр .Writer для них. Но в большинстве случаев это то, что вы хотите в любом случае.
Если вы хотите перехватить все файлы, вам нужно использовать несколько более сложный подход. Вместо промежуточного ПО вам нужно будет внедрить оболочку http.Handler, которая будет обертывать gin.Engine и будет использовать тот же подход, что и выше, чтобы перехватить и записать все, что написано на http.ResponseWriter. Затем запустите сервер джина, как это:
ginRouter := gin.New()
// configure your middleware and routes as required
// Run http server as follows, where bodyLogHandler is your wrapper handler
http.ListenAndServe(bindAddress, &bodyLogHandler{wrappedHandler: ginRouter}
если не уже, пожалуйста, проверьте обработку ошибок, упомянутые здесь https://github.com/gin-gonic/gin/issues/274 – Aravind
Хм, я думаю, что я получаю вашу точку , Я должен добавить ошибку в контекст и обработать ее в промежуточном программном обеспечении, правильно? Но я все еще интересуюсь тем, как получить тело ответа в промежуточном программном обеспечении, а что, если мне нужно что-то сделать на теле, прежде чем отправить его клиенту? Или какое-то странное требование заставляет меня получить тело ответа? –