Сетевое взаимодействие и коммуникации — основа любого современного мобильного приложения, работающего с удалёнными данными. В этой статье разберём REST API, GraphQL, HTTP/HTTPS, WebSocket, популярные библиотеки (Retrofit, OkHttp, URLSession, Alamofire, Ktor, Dio), а также кэширование, офлайн-режим, пагинацию и безопасность соединений (SSL Pinning, TLS). Материал подойдёт начинающим разработчикам, которые хотят разобраться в сетевом стеке мобильных приложений. Подробнее — в обзоре HTTP от MDN.
Главное
Выбор типа API — первое решение, которое влияет на архитектуру сетевых коммуникаций всего приложения. Рассмотрим три основных подхода.
REST (Representational State Transfer) — архитектурный стиль, основанный на HTTP-методах GET, POST, PUT, PATCH, DELETE. Каждый ресурс имеет уникальный URL (эндпоинт). REST прост в кэшировании, интуитивно понятен и широко поддерживается. Ответы обычно возвращаются в формате JSON. Для мобильных приложений REST остаётся стандартом де-факто благодаря простоте и совместимости.
// Пример REST запроса через Retrofit interface ApiService { @GET("users/{id}") suspend fun getUser(@Path("id") id: Int): User }
GraphQL — язык запросов от Facebook (Meta), где клиент сам указывает структуру ответа. Один эндпоинт, гибкие запросы, отсутствие overfetching (лишние данные) и underfetching (недостаточно данных). GraphQL особенно полезен для сложных вложенных данных (например, пользователь + его посты + комментарии). Недостатки: сложное кэширование, более крутая кривая обучения.
WebSocket — протокол полнодуплексной связи поверх TCP. После установки соединения (через HTTP-рукопожатие) обе стороны могут отправлять сообщения в любой момент. Используется для чатов, уведомлений, котировок, реалтайм-игр. В мобильных приложениях WebSocket часто сочетается с REST: REST для CRUD, WebSocket для реалтайм-обновлений.
| Характеристика | REST API | GraphQL | WebSocket |
|---|---|---|---|
| Транспорт | HTTP/HTTPS | HTTP/HTTPS | TCP (после HTTP upgrade) |
| Формат данных | JSON/XML | JSON (запрос и ответ) | Любой (JSON, Protobuf, текст) |
| Направление | Одностороннее (клиент → сервер) | Одностороннее | Двустороннее (full-duplex) |
| Кэширование | Встроенное (HTTP cache) | Сложное (требует Persisted Queries) | Не применимо |
| Типичное применение | CRUD, списки, детали | Сложные вложенные данные | Чаты, уведомления, live-данные |
Понимание транспортного уровня необходимо для диагностики сетевых проблем и оптимизации производительности коммуникаций.
HTTP (HyperText Transfer Protocol) — протокол прикладного уровня для передачи гипертекста. HTTPS — HTTP поверх TLS/SSL, обеспечивающий шифрование. Все современные мобильные приложения обязаны использовать HTTPS, так как Apple и Google требуют безопасные соединения (App Transport Security в iOS, network_security_config в Android).
TCP/IP — надёжный протокол с установкой соединения, гарантией доставки и порядком пакетов. Используется для HTTP, WebSocket, почты. UDP — быстрый, но ненадёжный (без подтверждения доставки). Используется для стриминга, VoIP, игр, где важна скорость, а не гарантия доставки каждого пакета.
HTTP-заголовки управляют кэшированием (Cache-Control, ETag, Last-Modified), форматом данных (Content-Type: application/json), аутентификацией (Authorization: Bearer). Правильная работа с заголовками критична для производительности: ETag и Last-Modified позволяют избежать повторной загрузки неизменённых данных.
Android предлагает несколько популярных библиотек для сетевых коммуникаций. Выбор зависит от требований проекта.
Retrofit (от Square) — типобезопасный HTTP-клиент для Android и Kotlin. Превращает HTTP-API в интерфейс Kotlin/Java. Работает поверх OkHttp и поддерживает корутины, RxJava и Call-адаптеры. Retrofit — стандарт для Android-разработки.
OkHttp — низкоуровневый HTTP-клиент от Square. Используется как основа для Retrofit, но может применяться и самостоятельно. OkHttp предоставляет Interceptor (для логирования, заголовков, ретраев), HTTP/2 multiplexing, автоматическое восстановление соединения и пул соединений.
Ktor Client — мультиплатформенный HTTP-клиент от JetBrains для Kotlin Multiplatform Mobile. Поддерживает Android, iOS, Web, Desktop. Нативная поддержка корутин, сериализации (kotlinx.serialization) и плагинов (логирование, аутентификация, WebSocket).
Volley — HTTP-библиотека от Google, популярная в старых проектах. Проста в настройке, автоматически управляет очередью запросов, поддерживает кэширование. Однако Volley не рекомендуется для новых проектов — Retrofit и OkHttp предоставляют больше возможностей и лучше интегрируются с современным Android-стеком.
В IT Sectr мы используем связку Retrofit + OkHttp для большинства Android-проектов с кастомными Interceptor для логирования, ретраев и аутентификации. Для KMM-проектов выбираем Ktor Client.
iOS разработчики могут использовать нативный URLSession или сторонние библиотеки для сетевых коммуникаций.
URLSession — нативный фреймворк Apple для HTTP-запросов. Поддерживает фоновые загрузки (background URLSession), WebSocket, протоколы делегирования, управление кэшем через URLCache. Начиная с iOS 15, URLSession поддерживает async/await, делая работу с сетью более удобной.
func fetchUser(id: Int) async throws -> User {
let url = URL(string: "https://api.example.com/users/\(id)")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode(User.self, from: data)
}
Alamofire — самая популярная сторонняя HTTP-библиотека для iOS. Предоставляет удобный API поверх URLSession: цепочки запросов, автоматическое преобразование JSON, валидацию, прогресс-загрузку, Multipart Upload. Alamofire особенно популярна в Objective-C проектах и при миграции с него на Swift.
Для Flutter и React Native существуют собственные популярные HTTP-клиенты для сетевых коммуникаций.
Dio — мощный HTTP-клиент для Flutter с поддержкой Interceptor, FormData, кэширования, таймаутов и retry-политик. Dio используется в большинстве Flutter-проектов как основная сетевая библиотека.
Axios — HTTP-клиент для JavaScript/TypeScript, работающий в React Native. Предоставляет удобный API для запросов, перехватчиков (interceptors), автоматического преобразования JSON и отмены запросов через CancelToken.
Безопасность сетевых коммуникаций — критически важная тема для мобильных приложений, работающих с персональными данными.
TLS (Transport Layer Security) — протокол шифрования, преемник SSL. Обеспечивает конфиденциальность, целостность и аутентификацию данных. Все мобильные приложения должны использовать TLS 1.2 или 1.3. Android и iOS запрещают незащищённые соединения (HTTP) по умолчанию.
SSL Pinning — механизм, при котором приложение проверяет сертификат сервера против заранее сохранённого сертификата или публичного ключа. Это защищает от MITM-атак, даже если CA-центр скомпрометирован. Реализуется через OkHttp (Android) с CertificatePinner или через URLSession (iOS) с URLSessionDelegate. OWASP Mobile Top 10 рекомендует SSL Pinning для приложений, работающих с финансовыми или медицинскими данными.
Современные мобильные приложения должны работать при нестабильном сетевом соединении. Стратегии кэширования и офлайн-режима — ключ к хорошему UX при ограниченных коммуникациях с сервером.
HTTP-кэширование использует заголовки Cache-Control (max-age, no-cache), ETag и Last-Modified. OkHttp и URLSession поддерживают кэширование из коробки. Дополнительно можно использовать Room или Core Data для кэша на уровне базы данных.
Offline-First — подход, при котором приложение сначала загружает данные из локального источника (кэш, БД), а затем обновляет их с сервера. Ключевые компоненты: локальное хранилище (Room, SQLite, Core Data), менеджер синхронизации (WorkManager для Android), мониторинг сети (ConnectivityManager, NWPathMonitor).
Для эффективной загрузки больших списков используется пагинация. Основные стратегии:
Библиотека Android Paging 3 упрощает реализацию пагинации с поддержкой Room, Network и корутин. В iOS UITableViewDiffableDataSource + пагинация через URLSession — стандартный подход. В IT Sectr мы используем Paging 3 для Android и Combine-based пагинацию для iOS.
При нестабильном соединении необходима стратегия повторных попыток (Retry Policy): exponential backoff, jitter, максимальное количество попыток. Для загрузки файлов используется Multipart Upload (большие файлы) или Chunked Transfer Encoding (потоковая передача). Библиотеки: OkHttp Interceptor для ретраев, Alamofire MultipartFormData для загрузки файлов.
Часто задаваемые вопросы
REST API использует HTTP-методы для работы с ресурсами по эндпоинтам. GraphQL — язык запросов, где клиент сам выбирает поля. REST проще в кэшировании, GraphQL эффективнее для сложных вложенных данных.
Android: Retrofit + OkHttp, Ktor, Volley. iOS: URLSession (нативная), Alamofire. Flutter: Dio, http. React Native: Axios, fetch. Выбор зависит от экосистемы.
SSL Pinning — механизм, при котором приложение проверяет сертификат сервера против сохранённого сертификата или публичного ключа. Защищает от MITM-атак при компрометации CA-центра.
Offline-First: данные сначала загружаются из локального кэша, затем обновляются с сервера. Используются Room/SQLite для кэша, WorkManager для фоновой синхронизации, ConnectivityManager/NWPathMonitor для мониторинга сети.
Cursor-пагинация — надёжнее offset-based для мобильных приложений. Offset-пагинация (page/limit) нестабильна при добавлении записей. Рекомендуется cursor-based с бесконечной прокруткой.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.