impressive17
@impressive17

Как в gorilla mux сделать серверную мидлвару?

Мне нужно ловить ответ сервера, доставать из него тело ответа и логировать его, допустим в консоль.
Подскажите, как в мидлваре получить доступ к телу ответа?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Есть вариант использовать httptest.ResponseRecorder, я его использовал ранее для написания тестов.

https://pkg.go.dev/net/http/httptest#ResponseRecorder

Пример будет примерно таким
func (m *LoggingMiddleware) LogBody(next http.Handler) http.Handler {
    fn := func(w http.ResponseWriter, r *http.Request) {
        wRecorder := httptest.NewRecorder()
        next.ServeHTTP(wRecorder, r)
        resp := wRecorder.Result()
        body, _ := io.ReadAll(resp.Body)
        // не забыть записать ответ в w
    }

    return http.HandlerFunc(fn)
}


Пример его использования из официальной документации https://pkg.go.dev/net/http/httptest#example-Respo...

Или, можно сделать свой responseWriter, в handler передавать свой writer, а потом, после обработки, записать полученный ответ сервера в оригинальный responseWriter
Что-то типа такого
func (m *LoggingMiddleware) LogBody(next http.Handler) http.Handler {
    fn := func(w http.ResponseWriter, r *http.Request) {
        var buf bytes.Buffer
        logWriter := NewLogToConsoleResponseWriter(&b)
        next.ServeHTTP(logWriter, r)
        // тут у вас в buf будет ответ сервера, с которым можно работать
        // главное потом не забыть записать его в `w`
    }

    return http.HandlerFunc(fn)
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы