Может ли HTTP-метод GET иметь тело запроса (request body)?

«Может ли HTTP-метод GET иметь тело запроса (request body)?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Технически — может, но семантически — не должен.

  • Спецификация HTTP не запрещает наличие тела у GET-запроса, но указывает, что сервер может его игнорировать.
  • Семантика метода: GET предназначен для получения (retrieval) данных, а не для их передачи. Данные для фильтрации или идентификации ресурса должны передаваться в URL (через query-параметры) или в заголовках.
  • Практика и совместимость: Многие промежуточные прокси, кэши и библиотеки не ожидают тело у GET и могут его отбросить, что приведет к ошибкам.

Неправильно (нестандартно):

GET /api/users HTTP/1.1
Host: example.com
Content-Type: application/json

{"active": true}

Правильно:

  • Использовать query-параметры: GET /api/users?active=true
  • Для передачи сложных данных использовать метод POST (или другой подходящий метод, например, PUT, PATCH).