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

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

Ответ

Да, технически возможно, но это противоречит стандарту HTTP.

  • Стандарт (RFC 7231): Спецификация не запрещает тело в GET-запросе, но указывает, что сервер должен его игнорировать. На практике многие серверы, прокси или брандмауэры могут отвергнуть такой запрос.
  • Практика: Использование тела в GET считается антипаттерном. Для передачи данных следует использовать:
    • Query-параметры в URL (например, ?search=value&page=2).
    • Методы POST или PUT, если данные сложные или объемные.
  • Исключения: Некоторые API (например, Elasticsearch) допускают GET с телом для удобства составления сложных поисковых запросов в JSON.

Пример отправки (curl, не рекомендуется):

curl -X GET -H "Content-Type: application/json" -d '{"query":{"match_all":{}}}' http://example.com/search

Рекомендуемая альтернатива (использование POST для поиска):

curl -X POST -H "Content-Type: application/json" -d '{"query":{"match_all":{}}}' http://example.com/search