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

    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)
    }
    Ответ написан
    5 комментариев