Какие методы HTTP запросов ты знаешь? Можно ли сказать, что методы — это всего лишь семантика, а не жесткие ограничения?

🎯 Зачем спрашивают
  • Проверить, знает ли кандидат базовую семантику HTTP (GET/POST/PUT/PATCH/DELETE).
  • Отличает ли он идемпотентные и безопасные методы (важно для архитектуры API).
  • Понимает ли он, как это связано с:
    • кэшированием (GET кэшируемый, POST — нет),
    • CORS (OPTIONS-запросы),
 
 
📝 Ответ
Коротко:
Есть следующие методы HTTP запросов:
  • GET — получить ресурс (без тела запроса).
  • HEAD — то же, что GET, но возвращает только заголовки (без тела).
  • POST — отправить данные на сервер, но и любое действие без идемпотентности (создание/обработка).
  • PUT — заменить ресурс целиком (идемпотентный).
  • PATCH — частичное обновление ресурса.
  • DELETE — удалить ресурс.
  • OPTIONS — запрос поддерживаемых сервером/ресурсом опций (CORS, Allow и т.п.).
  • CONNECT — установить туннель (обычно для HTTPS через прокси).
  • TRACE — эхо-запрос для отладки (возвращает запрос, как его видит сервер).
Методы — семантика, никто не мешает вам использовать только GET или только POST запросы. Разве что технические ограничения того, или иного метода (GET, например, не имеет тело запроса).
 
💡
Про тело GET запроса
Технически спецификация не запрещает тело, но оно игнорируется сервером, а потому и не имеет смысла. GET может иметь тело, но это не стандарт и почти нигде не используется
 
Более того, коды ошибок так же являются семантикой. Распространенный подход по работе с ошибками на стороне API возвращать всегда 500 status code, а вот в тело ответа класть информацию об ошибке:
{ "errorId": "42f99fc0-be3b-4d1d-a1c4-533f7b209bfd", "errorCode": "USER_IS_NOT_RESOURCE_OWNER", ... }
Все зависит от дизайна система и ваших договоренностей.
 
⚖️ Компромиссы
  • POST vs PUT: когда использовать?
  • PATCH vs PUT: разница в семантике и в сложности реализации?
 
🔎 Встречные вопросы
  • Чем отличаются безопасные и идемпотентные методы?
  • Почему PATCH не всегда идемпотентен?
  • Как методы связаны с кэшированием (например, GET → кэшируемый, POST → нет)?
  • Как OPTIONS используется в CORS?
 
🚩 Красные флаги
  • Да, есть строгие правила использования. Для каждой операции — свой метод
  • POST = только для создания ресурса (неверно, POST может быть и для других операций).
  • PUT и PATCH — это одно и то же (ошибка).
  • DELETE всегда безопасен (он идемпотентен, но не безопасен).
  • Чем небезопасен TRACE?
 
🛠 Практика
 
📚 Источники / ссылки