HTTPQUERY
Русский

GET

Применение

Запрос GET получает данные, не изменяя состояние сервера. Любое содержимое в теле запроса не имеет общепринятой семантики, и весь запрос выражается через целевой URI и заголовки. Ответы по умолчанию кэшируемы, что делает GET основой веб-кэширования.

GET — метод браузера по умолчанию для навигации, переходов по ссылкам и отправки форм без атрибута method.

Спецификация HTTP не запрещает тело в запросах GET, но семантика такого тела не определена. Браузеры и Fetch API отбрасывают тело запроса GET. Многие серверы и прокси игнорируют или отклоняют его. Полагаться на тело в запросе GET небезопасно с точки зрения совместимости.

Свойства

Поскольку GET безопасен и идемпотентен, многократная отправка одного и того же запроса даёт одинаковый результат и не изменяет ресурс. На эту гарантию опираются браузеры, сканеры и прокси.

Условный GET

Запрос GET становится условным, когда присутствует один или несколько заголовков-валидаторов: If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since или If-Range. Сервер проверяет условие и возвращает полное представление только тогда, когда условие выполнено.

Частичный GET

Включение заголовка Range превращает GET в частичный запрос. Сервер возвращает только запрошенный диапазон байтов со статусом 206. Статус 416 означает, что диапазон не может быть удовлетворён. Серверы, не поддерживающие диапазонные запросы, возвращают 200 с полным телом.

Частичный GET полезен для возобновления прерванных загрузок и потоковой передачи больших файлов сегментами.

Базовый GET

Минимальный запрос GET получает корневой ресурс. Сервер возвращает 200 с полным представлением.

Запрос

GET / HTTP/1.1
Host: example.com

Ответ

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1256

<!doctype html>
<html>...

Условный GET

Этот запрос содержит If-Modified-Since, поэтому сервер возвращает тело только в том случае, если ресурс изменился с указанной даты. Неизменившийся ресурс даёт ответ 304 без тела.

Запрос

GET / HTTP/1.1
Host: example.com
If-Modified-Since: Sat, 01 Jan 2022 12:00:00 GMT

Ответ (не изменён)

HTTP/1.1 304 Not Modified
ETag: "abc123"

Частичный GET

Заголовок Range запрашивает только первые 512 байт. Сервер отвечает статусом 206 и заголовком Content-Range, указывающим возвращённый сегмент.

Запрос

GET /file.bin HTTP/1.1
Host: example.com
Range: bytes=0-511

Ответ

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-511/8192
Content-Length: 512

CORS

GET входит в список безопасных для CORS методов. Кросс-доменные запросы GET не вызывают предварительный запрос, что делает GET методом по умолчанию для получения ресурсов с других источников в браузерах.

GET и POST

GET получает данные. POST отправляет данные на обработку. Параметры GET передаются в строке запроса URL, тогда как параметры POST помещаются в тело запроса.

Ответы на GET кэшируемы, и их можно добавить в закладки. Ответы на POST кэшируемы только при наличии явной информации о свежести. У URL есть практические ограничения по длине, что ограничивает объём данных, переносимых GET. У POST практических ограничений на размер тела нет.

GET одновременно безопасен и идемпотентен. POST не является ни тем, ни другим. Повторный GET возвращает тот же результат. Повторный POST создаёт дублирующиеся ресурсы или запускает обработку дважды.

Разница в производительности между GET и POST пренебрежимо мала. Выбор зависит от операции: для получения используется GET, для отправки — POST.

Безопасность

Параметры GET видны в URL, истории браузера, журналах сервера и заголовках Referer. Конфиденциальные данные, такие как пароли, токены и персональные сведения, никогда не должны попадать в строку запроса.

Запросы GET более уязвимы для CSRF-атак через теги и , которые автоматически инициируют запросы GET. POST без надлежащих токенов также уязвим для CSRF.

Ни GET, ни POST сами по себе не обеспечивают шифрование. Для защиты данных при передаче необходим HTTPS.

Влияние на SEO

Поисковые системы сканируют с помощью GET. Googlebot и другие поисковые роботы получают и индексируют страницы через GET, поэтому ресурс обнаружим только тогда, когда он отвечает на обычный запрос GET. Кэшируемые идемпотентные ответы на GET сканируются наиболее эффективно, поскольку роботы повторно используют валидаторы вроде ETag и Last-Modified, чтобы не загружать заново неизменившиеся страницы.