TGViewer
Алена QA-Pop Алена QA-Pop @qa_pop · 521 subscribers
Post #411 677
📱Наткнулась на интересный пост про идемпотентность, в котором была фраза "GET, PUT, DELETE - обычно идемпотентны".
Но что значит "обычно"? Может быть как-то иначе? Давайте разберемся!

Что такое идемпотентность в RESTful API?
Метод называют идемпотентным, если его повторный вызов с теми же параметрами не меняет состояние системы (сервера).

Простой пример с DELETE:
Отправим первый запрос:
DELETE /user/1 - удаляет пользователя с id=1

Отправим второй такой же запрос - состояние системы не меняется, пользователь был удалён при первом запросе.
Получается, результат системы один - пользователя нет!

Также рассмотрим простой пример с НЕидемпотентным методом, чтобы была понятна разница:
POST /api/users - 1-й вызов: создает юзера на ресурсе /api/users/1 (статус 201)
2-й вызов метода с теми же данными: создает нового юзера на ресурсе /api/users/2 (ещё один 201) (дубликат, но с другим id)!
Почему "обычно", а не "всегда"?


❗️Неправильная реализация бэкенда
По стандарту PUT или DELETE должны быть идемпотентны, но если разработчик сделал так, что повторный DELETE возвращает ошибку 500 или создает побочный эффект (например, меняет счётчик 💔), то метод уже не ведёт себя идемпотентно.

❗️Скрытые побочные эффекты
Пример 1:
GET /products - каждое обращение пишет в БД "пользователь смотрел каталог" и увеличивает счётчик просмотров. Получается состояние системы меняется?
GET перестал быть идемпотентным🙃🙃.

Пример 2:
GET /api/download-report?date=2025-08-10 - при каждом запросе сервер:
- генерирует новый файл отчёта,
- записывает в БД запись "Отчёт сформирован 10.08.2025 ",
- увеличивает счётчик скачиваний.
В итоге каждый вызов меняет данные в системе - значит, этот GET уже не идемпотентен 😂, хотя по стандарту должен быть.

❗️Внешние интеграции
Если у вас метод PUT или DELETE, а на стороне интеграции при каждом вызове что-то записывается/создаётся - идемпотентность нарушается.

Идемпотентность - это про договорённость в стандарте, а не автоматическую гарантию.
Даже GET можно сделать неидемпотентным, если бэкенд так запрограммирован.
#qa #api
🔚Дополнение на бусти:
Идемпотентность: Разбираем вопросы на собеседованиях. Готовые ответы + примеры
boosty.to СОБЕСЕДОВАНИЕ QA: Идемпотентность: вопросы на собеседованиях. Готовые ответы + примеры - Алена QA-Pop В различных источниках, пишущих об идемпотентности, вы можете встретить такие термины, как "система", "сервер" и "БД". Имейте в виду, что строго в рамках этого контекста мы их будем считать взаимозаменяемыми. 1) Что такое идемпотентность метода? Ответ: Когда…
  • ❤ 32
  • 🔥 18
More from @qa_pop
  1. Dec 18, 2025Когда ты слишком хороший QA - это не всегда плюс Если ты тот самый QA, который «тащит всё…
  2. Nov 25, 2025TCP против UDP: что выбрать? Каждый раз, отправляя данные в интернете, система делает выбо…
  3. Nov 19, 2025Коллеги, по состоянию здоровья я приостановила записи на консультации/созвоны/помощь в лич…
  4. Nov 13, 2025Что такое первичный ключ и внешний ключ в базе данных. Зачем они нужны? Первичный ключ (Pr…
  5. Nov 7, 2025📱 СОБЕСЕДОВАНИЕ QA: Основные виды SQL-команд: DML, DDL, DCL и DQL? SQL (Structured Query…
  6. Nov 2, 2025Что выбрать для API-тестирования: Postman или полноценный фреймворк Выбор между Postman и…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →