Как перестать воевать со стандартным http.Client в Go
Стандартная библиотека Go — штука монументальная и надежная, но когда дело доходит до написания HTTP-клиента для реального проекта, начинаешь чувствовать себя архитектором, которому выдали только кирпичи и мастерок, забыв про бетономешалку. Хочется просто отправить JSON и получить ответ, а приходится вручную маршалить структуры, следить за закрытием body, настраивать таймауты и писать бесконечные обертки для обработки ошибок.
Если вам знакомо чувство, когда if err != nil при работе с API занимает 70% кода, то проект resty — это именно та «бетономешалка», которой не хватает.
Что это такое и зачем оно в вашем проекте
По сути, resty — это надстройка над стандартным http.Client. Она не пытается переизобрести колесо, а просто делает работу с HTTP-запросами в Go человеческой. Проект живет с 2015 года, собрал больше 11 тысяч звезд и стал своего рода стандартом де-факто для тех, кто не хочет тратить время на бойлерплейт.
Главная фишка здесь — цепочечные вызовы (Fluent Interface). Вы описываете запрос как предложение, и это читается гораздо лучше, чем классическое создание http.Request с последующим client.Do(req).
Чем resty упрощает жизнь
Я выделил несколько вещей, которые заставляют меня подключать этот пакет в каждый второй микросервис.
Автоматизация JSON и XML
В стандартном клиенте вам нужно сначала превратить структуру в байты через json.Marshal, создать bytes.Reader, установить заголовок Content-Type... В resty вы просто передаете объект в метод SetBody. Библиотека сама поймет, как его упаковать, и подставит нужные заголовки. То же самое работает и в обратную сторону: передаете пустую структуру в SetResult, и на выходе получаете уже заполненный объект.
client := resty.New()
var user User
resp, err := client.R().
SetBody(&User{Name: "John"}).
SetResult(&user).
Post("https://api.example.com/users")
Умные повторы запросов
Сеть нестабильна, API иногда «моргает». Писать свою логику ретраев с экспоненциальной задержкой — сомнительное удовольствие. В resty это включается одной строкой. Можно настроить количество попыток, время ожидания и даже условия, при которых стоит пробовать снова (например, только если пришел статус 502 или 504).
Поддержка Server-Sent Events (SSE)
В версии v3 появилась полноценная поддержка SSE. Если вам нужно слушать поток событий от сервера, не нужно городить циклы и вручную парсить чанки данных. Resty берет это на себя, предоставляя удобный интерфейс для подписки на события.
Трассировка и отладка
Иногда нужно понять, почему запрос идет медленно или где именно он застревает. Resty умеет собирать детальную статистику: время резолва DNS, установки TCP-соединения, TLS-хендшейка и время до получения первого байта. Плюс есть встроенная поддержка логирования в стиле curl — можно одной командой вывести в консоль эквивалент запроса, который легко скопировать и проверить в терминале.
Технические нюансы
Проект требует Go версии 1.23 и выше для актуальной ветки v3. Архитектурно он построен вокруг двух сущностей: Client и Request. Вы настраиваете общие параметры (базовый URL, заголовки авторизации, таймауты) на уровне клиента, а специфику конкретного вызова — на уровне запроса.
Интересно, что авторы очень серьезно относятся к качеству кода. В README подчеркивается, что любой Pull Request должен сопровождаться тестами со 100% покрытием патча. Это объясняет, почему библиотека остается стабильной на протяжении многих лет.
Когда стоит использовать
Resty идеально подходит для:
- Написания SDK для своих или сторонних API.
- Интеграции микросервисов внутри системы.
- Быстрых скриптов для парсинга или автоматизации.
Если у вас очень простой проект с парой запросов, возможно, стандартного http.Client будет достаточно. Но как только появляется необходимость в авторизации, логировании, ретраях и работе с JSON-ответами, resty экономит часы написания однотипного кода.
Стоит ли пробовать? Определенно да, если вы пишете на Go и работаете с внешними сервисами. Это не «тяжеловесный» фреймворк, который диктует свои правила, а просто очень удобный и предсказуемый инструмент. Начать можно с официальной документации на resty.dev, там много живых примеров кода под разные задачи.
Единственный момент: если вы привыкли к абсолютному контролю над каждым байтом в http.Transport, вам может показаться, что resty скрывает слишком много магии. Но для 95% бизнес-задач эта «магия» — именно то, что нужно для спокойного сна разработчика.