Питання 3 · Розділ 6

Які основні HTTP методи використовуються в REST?

HTTP методи — це команди, які кажуть серверу, що потрібно зробити з ресурсом.

Мовні версії: English Russian Ukrainian

Junior Level

HTTP методи — це команди, які кажуть серверу, що потрібно зробити з ресурсом.

Основні методи:

Метод Дія Приклад Опис
GET Читання GET /users/1 Отримати дані (нічого не змінює)
POST Створення POST /users Створити новий ресурс
PUT Повне оновлення PUT /users/1 Замінити ресурс цілком
PATCH Часткове оновлення PATCH /users/1 Оновити частину ресурса
DELETE Видалення DELETE /users/1 Видалити ресурс

Властивості методів:

Метод Безпечний (Safe) Ідемпотентний
GET Так Так
POST Ні Ні
PUT Ні Так
PATCH Ні Залежить від реалізації
DELETE Ні Так
  • Безпечний (Safe): Метод не змінює стан сервера
  • Ідемпотентний: Повторний виклик з тими самими параметрами дає той самий результат

Додаткові методи:

  • HEAD: Як GET, але без тіла відповіді (для перевірки існування)
  • OPTIONS: Дізнатися, які методи підтримуються для ресурсу (використовується в CORS)

Middle Level

POST: Універсальний інструмент

POST — єдиний метод, який не є ідемпотентним. Він використовується:

  • Для створення ресурсів
  • Для запуску процесів (/jobs/1/start)
  • Для складного пошуку з великим тілом запиту

Pitfall: Браузери при натисканні “Назад” після POST видають попередження “Підтвердте повторну відправку форми”.

PUT vs PATCH

  • PUT вимагає передачі всього стану. Якщо забули поле — сервер повинен його обнулити
  • PATCH економить трафік (помітно на великих об’єктах з 50+ полями), але складніший у реалізації. Сервер повинен розрізняти: поле відсутнє в запиті (не чіпати) або явно передано як null (встановити в null).

HEAD і OPTIONS: Невидимі герої

  • HEAD: Повертає заголовки без тіла. Використовується для перевірки ETag, Content-Length
  • OPTIONS: Використовується в CORS. Браузер робить “Preflight request” перед крос-доменними запитами

TRACE і CONNECT

  • TRACE: Повертає запит клієнта назад. Небезпечний атаками Cross-Site Tracing (XST). У продакшені завжди вимикайте TRACE. В ізольованому dev-середовищі може бути корисним для налагодження проксі.
  • CONNECT: Для створення тунелів (через проксі для HTTPS). У звичайних REST API не використовується.

Діагностика

  • 405 Method Not Allowed: Перевірте заголовок Allow — сервер зобов’язаний повернути список дозволених методів
  • Spring Security: CSRF-захист увімкнено для всіх методів, крім GET, HEAD, OPTIONS, TRACE

Senior Level

Матриця властивостей (RFC 9110, 2022 — замінив RFC 7231)

Метод CRUD Safe Idempotent Cacheable
GET Read
POST Create/Action ⚠️*
PUT Replace
PATCH Partial Update ⚠️**
DELETE Delete

*POST може бути кешованим, якщо встановлені відповідні заголовки (рідко). *PATCH ідемпотентний, якщо логіка оновлення детермінована (наприклад, JSON Merge Patch).*

Проблема ідемпотентності DELETE

Якщо DELETE /users/1 повертає 200, а другий виклик 404 — це все одно ідемпотентно. Ідемпотентність — це стан сервера, а не код відповіді.

Method Tunneling

Деякі старі проксі не підтримують PATCH. Рішення: POST /resource із заголовком X-HTTP-Method-Override: PATCH.

Pre-fetching і безпека GET

Браузери можуть заздалегідь викликати GET-методи. Якщо GET не “Safe” (наприклад, GET /logout), це призведе до випадкового виходу користувача.

Highload

  • Ідемпотентність впливає на можливість автоматичних повторів запитів
  • POST не можна автоматично повторювати при тайм-ауті (ризик подвійних оплат)
  • Service Mesh (Istio, Linkerd) автоматично повторює ідемпотентні запити при 503

🎯 Шпаргалка для співбесіди

Обов’язково знати:

  • 5 основних методів: GET (читання), POST (створення), PUT (повне оновлення), PATCH (часткове оновлення), DELETE (видалення)
  • GET — безпечний (Safe) та ідемпотентний, не повинен змінювати стан сервера
  • POST — єдиний метод, який не є ідемпотентним
  • PUT завжди ідемпотентний (повна заміна ресурса), DELETE теж ідемпотентний
  • PATCH ідемпотентний тільки якщо операція детермінована (replace — так, add — ні)
  • HEAD повертає заголовки без тіла (для перевірки ETag, Content-Length)
  • OPTIONS використовується в CORS preflight запитах
  • TRACE і CONNECT у звичайних REST API не використовуються; TRACE небезпечний XST-атаками

Часті уточнюючі запитання:

  • Чому POST не ідемпотентний? — Кожен POST може створити новий ресурс (5 POST = 5 замовлень)
  • Чи можна використовувати GET для видалення? — Ні, GET зобов’язаний бути безпечним; браузери можуть попередньо завантажувати GET
  • Коли використовувати PATCH замість PUT? — Для великих об’єктів або коли кілька клієнтів змінюють різні поля паралельно
  • Що повертає OPTIONS? — Список дозволених методів для ресурсу (заголовок Allow)

Червоні прапорці (НЕ говорити):

  • «POST можна безпечно повторювати при тайм-ауті» — це ризик подвійних операцій
  • «GET може змінювати дані, це нормально» — GET зобов’язаний бути Safe за RFC
  • «PATCH завжди ідемпотентний» — залежить від реалізації (add у масив — не ідемпотентно)
  • «TRACE корисний у продакшені» — TRACE небезпечний Cross-Site Tracing атаками

Пов’язані теми:

  • [[Що таке ідемпотентність (idempotency)]]
  • [[Які HTTP методи ідемпотентні]]
  • [[Чому GET та DELETE ідемпотентні]]
  • [[Чи є POST ідемпотентним]]
  • [[В чому різниця між PUT та PATCH]]