> Как избежать двойного оформления заказа при нестабильном интернете и повторных запросах? (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Travelata

Стек: iOS, Swift

> Пример ответа

Для предотвращения дублирования заказов при нестабильном интернете в iOS-приложении на Swift применяется идиомпенотентность (idempotency) запросов. Ключевой подход - генерация уникального ключа идемпотентности (idempotency key) на клиенте перед отправкой запроса.

Реализация:

  1. Генерация UUID для каждого нового заказа. Например, let orderId = UUID().uuidString.

  2. Сохранение ключа в локальном хранилище (UserDefaults или Core Data) до получения успешного ответа от сервера.

  3. Передача ключа в заголовке HTTP-запроса (например, Idempotency-Key: <UUID>).

  4. Обработка повторных запросов: если запрос не удался (таймаут, ошибка сети), клиент повторяет запрос с тем же ключом. Сервер, получив ключ, проверяет, был ли заказ уже создан, и возвращает результат предыдущего выполнения (без дублирования).

Дополнительные меры:

  • Блокировка UI во время отправки запроса (например, отключение кнопки "Оформить").

  • Таймер повторных попыток с экспоненциальной задержкой (retry with exponential backoff).

  • Проверка состояния заказа перед повторной отправкой (если сервер возвращает статус, клиент может отменить дублирующий запрос).

Пример кода на Swift:

SWIFT
func 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()
}

Этот подход гарантирует, что даже при повторных отправках заказ будет оформлен ровно один раз.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью