Ответ вслух Middle Сеть, Codable и хранение спрашивают часто обновлено

Как спроектировать сетевой слой iOS-приложения

Вопрос

Расскажите, как вы строите сетевой слой.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Эндпоинты у меня описаны как данные: путь, метод, параметры, тело и ожидаемый тип ответа. Клиент один, поверх URLSession с async/await: собирает запрос, добавляет токен, проверяет статус, декодирует.

Что должно прозвучать в ответе

  • Описание эндпоинтов как данных (путь, метод, параметры, тип ответа)

  • Один клиент на `URLSession` с async/await и проверкой статусов

  • Авторизация и обновление токена в одном месте, одно обновление на все параллельные 401

  • Декодирование с настроенным `JSONDecoder`, устойчивость к битым элементам

  • Ошибки в доменные типы, ретраи с backoff для идемпотентных

  • Протокол клиента для подмены в тестах

Что могут спросить следом

  • Как избежать параллельных обновлений токена?
  • Нужен ли Alamofire в 2026 году?

Разбор

Эндпоинты у меня описаны как данные: путь, метод, параметры, тело и ожидаемый тип ответа. Клиент один, поверх URLSession с async/await: собирает запрос, добавляет токен, проверяет статус, декодирует. Обновление токена централизовано: если несколько запросов одновременно получили 401, обновление выполняется один раз, а остальные ждут его результат, это удобно сделать актором, который хранит текущую Task обновления. Ошибки транспорта и статусы превращаю в доменные: нет сети, сессия истекла, сервер недоступен. Для идемпотентных запросов есть ретраи с экспоненциальной задержкой. Клиент закрыт протоколом, и в тестах подставляю фейк или URLProtocol-заглушку. Сторонние библиотеки вроде Alamofire сейчас не обязательны: URLSession с async/await закрывает почти всё.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.