Каковы основные ограничения HTTP-метода GET?

«Каковы основные ограничения HTTP-метода GET?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод GET имеет несколько важных технических и семантических ограничений:

1. Ограничение длины URL и строки запроса (Query String):

  • Спецификация HTTP не определяет лимит, но практические ограничения накладываются браузерами, серверами и промежуточным ПО.
  • Типичный лимит браузеров — ~2048 символов для полного URL.
  • Серверы (например, Apache, Nginx) имеют настраиваемые лимиты (LimitRequestLine).

2. Семантика и безопасность:

  • Идемпотентный и безопасный (safe): GET не должен изменять состояние сервера. Повторные вызовы должны давать тот же результат без побочных эффектов.
  • Данные в открытом виде: Параметры передаются в URL, поэтому они:
    • Видны в истории браузера, логах сервера и прокси.
    • Могут быть закэшированы.
    • Не подходят для передачи конфиденциальной информации (паролей, токенов).

3. Не предназначен для передачи больших объемов данных или сложных структур:

  • Нет тела запроса (в классическом использовании). Все данные — в URL.
  • Неудобно передавать вложенные объекты или бинарные данные.

Плохая практика (НЕ ДЕЛАЙТЕ ТАК):

GET /login?username=admin&password=secret123 HTTP/1.1
Host: example.com

Правильная альтернатива для конфиденциальных или объемных данных — метод POST (или PUT/PATCH):

POST /login HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "username": "admin",
  "password": "secret123"
}

Когда использовать GET: Для получения данных, фильтрации (параметры запроса), кэшируемых запросов. Например, поиск товаров: GET /products?category=books&sort=price. Когда НЕ использовать GET: Для операций, изменяющих данные (создание, обновление, удаление), передачи чувствительной информации, загрузки файлов.