Короткий ответ
GET запрашивает представление ресурса и не должен менять состояние сервера, параметры передаются в URL; POST отправляет данные для создания ресурса или выполнения действия и обычно изменяет состояние, данные идут в теле запроса.
Как это работает подробнее
GET — безопасный (safe) и идемпотентный метод: повторный вызов с теми же параметрами не меняет данные и возвращает тот же результат (если данные не поменялись извне). POST не является ни безопасным, ни идемпотентным по умолчанию — два одинаковых POST-запроса могут создать два разных ресурса.
Пример кода
example.txt
GET /api/v1/users?status=active&page=2 HTTP/1.1
Host: example.com
Accept: application/json
POST /api/v1/users HTTP/1.1
Host: example.com
Content-Type: application/json
{"name": "Иван", "email": "ivan@example.com"}Что использовать на практике
- Рекомендация. GET используют для получения списков, карточек объектов, поиска с фильтрами через query-параметры. POST — для создания ресурса, отправки форм, выполнения операций без естественного ресурса (например,
/login,/orders/{id}/cancel). GET-запросы можно кэшировать, POST — как правило нет.
Подводные камни
- Риски. передавать в GET чувствительные данные в query-параметрах (логируются серверами и проксями); использовать GET для операций с побочными эффектами (например,
/delete-user?id=5), что ломает идемпотентность и опасно при предзагрузке ссылок ботами/браузером; забывать, что тело GET-запроса не гарантированно поддерживается промежуточными прокси.