Разбор Go HTTP Middleware

Перестаньте копировать и вставлять один и тот же код в каждый обработчик.

Если вам нужно проверить аутентификацию, залогировать длительность запроса или добавить уникальный ID к каждому запросу, не пишите эту логику внутри ваших бизнес-обработчиков. Если у вас 20 обработчиков, вам придется вносить изменения в 20 разных мест при обновлении логики аутентификации. Это кошмар для поддержки кода.

Middleware решает эту проблему. Вы пишете логику один раз, оборачиваете ею свои обработчики и больше к ней не прикасаетесь.

Что такое Middleware?

В Go middleware — это функция, которая: • Принимает http.Handler. • Возвращает новый http.Handler. • Выполняет действия до или после запуска основного обработчика.

Представьте это в виде луковицы. Каждый слой оборачивает следующий. Запрос проходит через каждый слой на пути «внутрь». Ответ проходит через каждый слой на пути «наружу».

Чему вы научитесь:

• Основы интерфейса http.Handler. • Как создавать собственные middleware с нуля. • Как объединять несколько слоев в цепочку. • Как передавать данные через цепочку с помощью context. • Продвинутые советы, такие как порядок выполнения и восстановление после panic.

Ключевые выводы:

• Порядок имеет значение. Если одно middleware устанавливает значение в context, следующее middleware в цепочке должно быть тем, которое его считывает. Если вы поменяете их местами, данные будут пустыми.

• Всегда делайте return после досрочного выхода. Если вы обнаружили ошибку и отправили http.Error, немедленно вызовите return. Если вы вызовете next.ServeHTTP после отправки ошибки, ваш сервер уйдет в panic.

• Используйте кастомные типы для ключей context. Не используйте обычные строки в качестве ключей. Это предотвратит перезапись данных из разных пакетов.

• Используйте обертку для захвата данных. Поскольку стандартный http.ResponseWriter не позволяет прочитать статус-код после того, как он был записан, вам нужно создать кастомную структуру, чтобы перехватить и сохранить его для ваших логов.

Освойте эти паттерны, чтобы заложить прочный фундамент для своих Go HTTP-серверов.

Источник: https://dev.to/ferztyle/go-http-middleware-explained-what-it-is-how-it-works-and-how-to-build-your-own-1ma7