QA Interview Hub · База знань · Тести

API

HTTP-методи й ідемпотентність

HTTP-методи, ідемпотентність, PUT vs PATCH

Основні методи: GET — отримати ресурс, POST — створити, PUT — повністю замінити, PATCH — частково змінити, DELETE — видалити. Також HEAD повертає лише заголовки, а OPTIONS — дозволені методи, його використовує CORS preflight. Safe-методи не змінюють стан сервера: GET, HEAD, OPTIONS.

Ідемпотентний метод — коли кілька однакових запитів дають той самий стан сервера, що й один. GET, PUT і DELETE ідемпотентні, POST — ні: два POST створять два записи. Відповідь при цьому може відрізнятися, наприклад повторний DELETE поверне 404 замість 204.

PUT надсилає повне представлення ресурсу, і поля, яких немає в тілі, можуть бути скинуті. PATCH надсилає лише поля, що змінюються. PATCH не гарантовано ідемпотентний, наприклад операція «збільшити лічильник на 1». Це варто перевіряти в тестах: повторний PUT не повинен створювати дублікатів.

Таблиця методів

Ідемпотентний метод — це той, де повторний ідентичний запит не змінює стан сервера понад перший. Безпечний — той, що взагалі не змінює даних.

МетодДля чогоТілоІдемпотентнийТиповий успішний код
GETОтримати ресурс або списокНіТак (і безпечний)200
POSTСтворити ресурс або виконати діюТакНі201
PUTЗамінити ресурс повністюТакТак200 або 204
PATCHЗмінити окремі поляТакНе гарантовано200
DELETEВидалити ресурсЗазвичай ніТак204 або 200
HEADЯк GET, але лише заголовкиНіТак200
OPTIONSЯкі методи дозволені; CORS preflightНіТак204

Ідемпотентність стосується стану сервера, а не відповіді. Повторний DELETE може повернути 404 замість 204, але ресурс так само видалений — метод залишається ідемпотентним. HEAD корисний, коли треба перевірити наявність ресурсу чи розмір файлу без завантаження тіла.

На співбесіді: GET, PUT, DELETE, HEAD і OPTIONS ідемпотентні, POST — ні, а PATCH не гарантовано. Безпечні методи, як GET і HEAD, взагалі не змінюють даних.

PUT vs PATCH і Idempotency-Key у фінтеху

PUT vs PATCH. PUT надсилає весь об'єкт, і поле, яке ви не передали, може стати порожнім. PATCH змінює лише передані поля. Це готовий тест-кейс: зробити PUT без одного поля і перевірити через GET, що з ним сталося. Якщо поле стерлося, а в документації написано, що PUT — це повна заміна, то поведінка коректна; якщо ж API поводиться як PATCH, це розбіжність з контрактом.

Фінтех. POST неідемпотентний, тому повторне натискання «Сплатити» або повтор запиту після таймауту мережі може списати гроші двічі. Захист — заголовок Idempotency-Key: клієнт генерує унікальний ключ, сервер запам'ятовує його і на повтор повертає той самий результат, не створюючи другий платіж.

Як я це тестую:

  1. Відправити POST /transfers з ключем K1, отримати 201 і id переказу.
  2. Відправити той самий запит з тим самим K1.
  3. Перевірити, що відповідь містить той самий id, а в базі чи історії транзакція одна.
  4. Відправити інше тіло з тим самим K1 і перевірити, що сервер повертає помилку (часто 409 або 422), а не тихо виконує новий платіж.
На співбесіді: PUT замінює ресурс цілком, PATCH змінює лише передані поля, і я перевіряю це через GET після PUT без одного поля. Для платежів POST захищають Idempotency-Key, і я тестую, що повтор з тим самим ключем не створює другої транзакції.