🎯 Зачем спрашивают
- Проверить, знает ли кандидат базовую семантику 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?