Что такое идемпотентность в контексте сетевых запросов?

«Что такое идемпотентность в контексте сетевых запросов?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Идемпотентность — это свойство операции, при котором её многократное выполнение даёт тот же результат, что и однократное. Это критически важно для надёжности сетевых взаимодействий, особенно при возможных повторах запросов.

Почему это важно?

Повторный запрос (из-за таймаута или сбоя сети) не должен вызывать побочных эффектов, отличных от однократного выполнения.

Примеры HTTP-методов:

  • Идемпотентные: GET, HEAD, PUT, DELETE, OPTIONS, TRACE.
  • Неидемпотентный: POST (создание нового ресурса при каждом вызове).

Практический пример в Swift:

// Идемпотентная операция: установка значения
func updateUserStatus(to status: String, for userId: String) {
    // PUT /users/{userId}/status с телом { "status": status }
    // Многократный вызов с одними данными даст одинаковый результат.
}

// Неидемпотентная операция: увеличение счётчика
func incrementCounter() {
    // POST /counter/increment
    // Каждый вызов увеличит значение, результат будет разным.
}

Ключевой принцип:

Идемпотентность обеспечивается семантикой операции, а не серверной реализацией. Клиент вправе ожидать, что повторная отправка того же идемпотентного запроса безопасна.