Чем HTTP GET отличается от POST?
- Когда использовать GET, а когда POST?
GET — получить ресурс: безопасный (не меняет состояние) и идемпотентный, параметры в URL, ответ кэшируется. POST — отправить данные на обработку или создать ресурс: не идемпотентный, данные в теле.
- GET можно повторять, сохранять в закладки, кэшировать, предзагружать
- Тело GET серверы и прокси игнорируют — на него не полагаются
- Секретные параметры — не в URL: попадают в логи и историю
А ещё Для изменения — PUT, PATCH, DELETE; POST — для создания и «действий»
Подробно
GET:
- читает представление ресурса и не должен менять состояние сервера;
- параметры — в пути и строке запроса (
/orders?status=paid); - идемпотентен: браузеры, прокси и клиенты повторяют и предзагружают GET;
- кэшируется по заголовкам
Cache-ControlиETag.
POST:
- отправляет данные в теле (JSON, форма, файл);
- создаёт ресурс (
201 Created+Location) или выполняет действие (POST /orders/42/cancel); - не идемпотентен: два запроса — два заказа; для безопасных повторов — ключ идемпотентности;
- по умолчанию не кэшируется.
Ошибки на практике: изменение данных в GET (ссылку «удалить» из письма открыл антивирус или предзагрузка); пароль или токен в строке запроса — оказывается в логах сервера, прокси и истории браузера.
В Spring: @GetMapping, @PostMapping; параметры GET — @RequestParam, @PathVariable; тело POST — @RequestBody.
Что хотят услышать
- Безопасность и идемпотентность GET, отсутствие их у POST.
- Где передаются данные, кэширование.
- Практические ошибки.
Частые ошибки
- Менять состояние в GET.
- Передавать секреты в URL.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗GET изменяет данные на сервере, а POST только читает их и кэшируется
- ✗Оба идемпотентны и кэшируются одинаково
- ✗POST можно отправить только из HTML-формы, а GET — только из JavaScript
- ✓GET — безопасное идемпотентное чтение; POST передаёт данные, не идемпотентен
Что спросят дальше
- Чем PUT отличается от PATCH?
- Что значит idempotent?
Разбор темы
- Spring MVC: DispatcherServlet и обработка запроса
Конвейер обработки запроса, @Controller против @RestController, маппинги, извлечение данных и контроль ответа.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.