> Как избежать двойного оформления заказа при нестабильном интернете и повторных запросах? (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Travelata
Стек: iOS, Swift
> Пример ответа
Для предотвращения дублирования заказов при нестабильном интернете в iOS-приложении на Swift применяется идиомпенотентность (idempotency) запросов. Ключевой подход - генерация уникального ключа идемпотентности (idempotency key) на клиенте перед отправкой запроса.
Реализация:
-
Генерация UUID для каждого нового заказа. Например,
let orderId = UUID().uuidString. -
Сохранение ключа в локальном хранилище (UserDefaults или Core Data) до получения успешного ответа от сервера.
-
Передача ключа в заголовке HTTP-запроса (например,
Idempotency-Key: <UUID>). -
Обработка повторных запросов: если запрос не удался (таймаут, ошибка сети), клиент повторяет запрос с тем же ключом. Сервер, получив ключ, проверяет, был ли заказ уже создан, и возвращает результат предыдущего выполнения (без дублирования).
Дополнительные меры:
-
Блокировка UI во время отправки запроса (например, отключение кнопки "Оформить").
-
Таймер повторных попыток с экспоненциальной задержкой (retry with exponential backoff).
-
Проверка состояния заказа перед повторной отправкой (если сервер возвращает статус, клиент может отменить дублирующий запрос).
Пример кода на Swift:
SWIFTfunc placeOrder(idempotencyKey: String, completion: @escaping (Result<Order, Error>) -> Void) {var request = URLRequest(url: url)request.httpMethod = "POST"request.setValue(idempotencyKey, forHTTPHeaderField: "Idempotency-Key")// ... настройка тела запросаURLSession.shared.dataTask(with: request) { data, response, error in// Обработка ответа}.resume()}
Этот подход гарантирует, что даже при повторных отправках заказ будет оформлен ровно один раз.
> Похожие задачи по mobile
Расскажите о своем предыдущем опыте
Какие есть варианты кэширования на уровне приложения?
Как устроены слои в чистой архитектуре?
В чем разница HTTP методов GET, POST, PUT, DELETE и когда их использовать
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью