Открыть сервис

Метод GET

Метод GET — это один из основных методов протокола HTTP, предназначенный для запроса ресурса с сервера. Согласно спецификации HTTP, метод GET является идемпотентным и безопасным, то есть не должен изменять состояние сервера и при повторении одного и того же запроса должен возвращать один и тот же результат (при условии, что ресурс не изменился). GET является наиболее часто используемым методом в веб-браузерах при переходе по ссылкам и загрузке веб-страниц.

История

Метод GET был определён в первой версии протокола HTTP (HTTP/0.9), разработанной Тимом Бернерсом-Ли в 1991 году. В этой версии метод GET был единственным доступным методом, и его синтаксис был крайне прост: строка запроса состояла из слова GET, пробела и пути к ресурсу. В последующих версиях HTTP (HTTP/1.0, HTTP/1.1, HTTP/2, HTTP/3) метод GET сохранился, но его семантика и возможности были расширены. В HTTP/1.1 (RFC 2616, 1999 год) были чётко определены требования к идемпотентности и безопасности GET-запросов, а также введены условные запросы (conditional GET) с использованием заголовков If-Modified-Since и If-None-Match, позволяющие кэшировать ответы и снижать нагрузку на сервер.

Синтаксис и структура

GET-запрос состоит из стартовой строки, заголовков и, в отличие от метода POST, не имеет тела сообщения. Стартовая строка имеет следующий формат: `` GET /путь/к/ресурсу?параметр1=значение1&параметр2=значение2 HTTP/1.1 `` Здесь:

  • GET — имя метода.
  • /путь/к/ресурсу — путь к запрашиваемому ресурсу на сервере.
  • ?параметр1=значение1&параметр2=значение2 — строка запроса (query string), содержащая параметры, передаваемые серверу. Параметры отделяются от пути вопросительным знаком, а друг от друга — амперсандом.
  • HTTP/1.1 — версия протокола.

Пример полного GET-запроса: `` GET /search?q=HTTP&lang=ru HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Accept: text/html ``

Передача данных

Основной способ передачи данных в GET-запросе — строка запроса (query string). Все параметры и их значения кодируются в URL-кодировке (percent-encoding), что позволяет передавать символы, недопустимые в URL (например, пробелы, кириллицу, специальные символы). Например, пробел кодируется как %20, а символ & — как %26.

Максимальная длина URL, а следовательно, и объём передаваемых данных, не регламентирована спецификацией HTTP, но на практике ограничена реализациями серверов и клиентов. Обычно рекомендуется не превышать 2000–8000 символов. Браузеры, такие как Internet Explorer, имели ограничение в 2083 символа, в то время как современные браузеры (Chrome, Firefox, Safari) допускают URL длиной до 64–128 Кбайт, но серверы могут иметь более жёсткие ограничения.

Идемпотентность и безопасность

Согласно спецификации HTTP, метод GET является:

  • Безопасным (safe) — не должен вызывать побочных эффектов на сервере, таких как изменение данных, создание записей, отправка писем и т.д. Сервер не должен изменять своё состояние в ответ на GET-запрос.
  • Идемпотентным (idempotent) — повторение одного и того же запроса несколько раз должно приводить к одному и тому же результату (при условии, что ресурс не изменился между запросами).

Эти свойства делают GET-запросы пригодными для кэширования, индексации поисковыми системами и безопасного повторения (например, при обновлении страницы браузером).

Кэширование

GET-запросы широко поддерживают кэширование. Сервер может указать в заголовках ответа (Cache-Control, Expires, ETag, Last-Modified) политику кэширования для ресурса. Клиенты (браузеры, прокси-серверы) могут сохранять ответы на GET-запросы и использовать их при повторных запросах без обращения к серверу. Для проверки актуальности кэша используются условные GET-запросы с заголовками If-Modified-Since (сравнение с датой последнего изменения) или If-None-Match (сравнение с ETag). Если ресурс не изменился, сервер возвращает статус 304 Not Modified без тела ответа.

Применение

Метод GET используется в следующих сценариях:

  • Загрузка веб-страниц, изображений, стилей, скриптов и других статических ресурсов.
  • Передача параметров поиска, фильтрации, сортировки в веб-приложениях (например, поисковые системы, интернет-магазины).
  • Получение данных через REST API (например, GET /users/123 для получения информации о пользователе).
  • Работа с кэширующими прокси-серверами и CDN.
  • Переход по ссылкам и закладки (bookmarks) — URL с GET-параметрами можно сохранить и воспроизвести позже.

Ограничения и недостатки

  • Ограниченный объём данных — из-за ограничений на длину URL передача больших объёмов данных (например, файлов, длинных текстов) невозможна.
  • Видимость данных — параметры передаются в строке запроса, которая может быть видна в истории браузера, логах сервера, реферере и т.д. Это делает GET непригодным для передачи конфиденциальной информации (паролей, токенов, персональных данных).
  • Небезопасность для изменения данных — использование GET для операций, изменяющих состояние сервера (например, удаление записи), нарушает спецификацию и может привести к непреднамеренным действиям (например, при предзагрузке ссылок браузером или ботами).

Примеры

Простой GET-запрос (загрузка страницы)

`` GET /index.html HTTP/1.1 Host: www.example.com ` Ответ сервера: `` HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 1234

<!DOCTYPE html> <html>... ```

GET-запрос с параметрами (поиск)

`` GET /search?q=HTTP+метод&page=1 HTTP/1.1 Host: example.com ` В этом примере сервер получает параметры q (со значением «HTTP метод») и page` (со значением «1»).

Условный GET-запрос (кэширование)

`` GET /style.css HTTP/1.1 Host: example.com If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT ` Если файл не изменялся после указанной даты, сервер возвращает: ` HTTP/1.1 304 Not Modified ``

Альтернативы

  • POST — используется для отправки данных на сервер, обычно с телом запроса. Не является идемпотентным и безопасным.
  • HEAD — аналогичен GET, но сервер возвращает только заголовки ответа без тела. Используется для проверки доступности ресурса, получения метаданных (например, размера файла).
  • OPTIONS — позволяет получить информацию о поддерживаемых методах и параметрах для ресурса.
  • PATCH — используется для частичного обновления ресурса.

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

При использовании GET-запросов необходимо учитывать следующие аспекты безопасности:

  • Защита от CSRF — поскольку GET-запросы могут быть инициированы автоматически (например, через тег <img> или <script>), важно не использовать GET для выполнения действий, изменяющих состояние сервера.
  • Конфиденциальность — параметры в URL не должны содержать пароли, сессионные токены, персональные данные, так как они могут быть перехвачены или сохранены в логах.
  • SQL-инъекции — параметры GET-запроса могут быть использованы для атак на сервер, если не проводится их валидация и экранирование.

Источники

  1. RFC 7231 — Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content, 2014.
  2. RFC 7540 — Hypertext Transfer Protocol Version 2 (HTTP/2), 2015.
  3. RFC 9110 — HTTP Semantics, 2022.
  4. Fielding, R. T. — Architectural Styles and the Design of Network-based Software Architectures (диссертация), 2000.
  5. Berners-Lee, T. — The Original HTTP as defined in 1991, World Wide Web Consortium.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →