В чём разница между HTTP-методами GET и POST?

«В чём разница между HTTP-методами GET и POST?» — вопрос из категории Other, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

GET и POST — это основные HTTP-методы, отличающиеся семантикой (назначением) и технической реализацией.

Аспект GET POST
Назначение (Семантика) Получение (Read) данных. Запрос не должен изменять состояние сервера (идемпотентный и безопасный). Отправка (Create/Submit) данных для обработки. Запрос часто приводит к изменению состояния на сервере (создание заказа, отправка формы).
Данные в запросе Передаются в URL как query-параметры (?key=value&...). Видимы в истории браузера, логах. Передаются в теле (body) запроса. Не видны в URL. Могут быть в разных форматах (JSON, XML, form-data).
Кэширование Да. Ответы на GET-запросы могут кэшироваться браузером и промежуточными прокси. Нет. Ответы на POST по умолчанию не кэшируются.
Длина данных Ограничена длиной URL (зависит от браузера/сервера, обычно несколько КБ). Теоретически не ограничена (на практике лимиты задаются сервером).
Закладки/Повтор GET-запрос можно добавить в закладки или повторить простым обновлением страницы. Повторная отправка POST-запроса (например, при обновлении страницы) обычно вызывает предупреждение браузера о повторной отправке данных.
Использование в HTML Используется по умолчанию для ссылок (<a>) и форм (<form method="get">). Используется в формах для отправки данных (<form method="post">).

Примеры:

  1. GET запрос (поиск товаров):

    GET /api/products?category=books&sort=price&page=2 HTTP/1.1
    Host: example.com

    Цель: Получить 2-ю страницу списка книг, отсортированную по цене. Ничего на сервере не создается.

  2. POST запрос (создание заказа):

    POST /api/orders HTTP/1.1
    Host: example.com
    Content-Type: application/json
    
    {"productId": 123, "quantity": 2, "customerEmail": "user@example.com"}

    Цель: Отправить данные для создания нового ресурса (заказа) на сервере.

Ключевое правило RESTful API: Используйте GET для операций чтения, а POST — для операций создания или любых действий, которые не являются идемпотентными (повторный запрос может дать разный результат).