В чем разница GET-запроса и POST-запроса в HTTP
Что проверяют
Понимаете ли вы семантику методов, а не только «GET читает, POST пишет». Отсюда обычно вырастает разговор про идемпотентность, кэширование и безопасность.
Как отвечать
Разница в назначении и в свойствах, которые из него следуют.
| GET | POST | |
|---|---|---|
| Назначение | получить ресурс | отправить данные, изменить состояние |
| Данные | в адресе, в строке запроса | в теле запроса |
| Идемпотентность | да, повтор ничего не меняет | нет, повтор создаёт ещё одну запись |
| Кэширование | кэшируется | нет |
| В истории браузера и логах | адрес виден целиком | тело не пишется |
| Длина | ограничена длиной адреса | практически не ограничена |
Ключевое свойство, ради которого вопрос и задают: GET безопасен и идемпотентен. Безопасен значит не меняет состояние, поэтому его свободно повторяют краулеры, прокси и кнопка «обновить». Идемпотентен значит десять одинаковых запросов дают тот же результат, что один.
Именно поэтому корзину нельзя очищать по GET: браузер или предзагрузка ссылки сделают это без ведома пользователя.
Где спотыкаются
Говорят, что POST безопаснее, потому что данные не видно. Без TLS оба видны целиком: шифрование даёт HTTPS, а не выбор метода. Разница лишь в том, что адрес оседает в истории, логах сервера и заголовке Referer.
Забывают про идемпотентность, а это главный практический критерий выбора метода.
Не знают соседей: PUT (заменить целиком, идемпотентен), PATCH (изменить частично), DELETE (удалить, идемпотентен). И то, что у GET тело формально разрешено, но его игнорируют почти все посредники.