I думаю, спецификация позволяет вам добавить тело сообщения, поэтому ответ на ваш вопрос должен быть Нет (но с оговорками).
Давайте сначалапроверьте спецификацию (я цитирую RFC 7231 , RFC 7232 и RFC 7234 , поскольку RFC 2616, упомянутый в других ответах, был ими устаревшим).
Из RFC 7230 :
The presence of a message body in a request is signaled by a
Content-Length or Transfer-Encoding header field. Request message
framing is independent of method semantics, even if the method does
not define any use for a message body.
Обратите внимание, что часть "тело сообщения НЕ ДОЛЖНА быть включена в запрос, если спецификация запросаМетод (раздел 5.1.1) не позволяет отправлять тело объекта в запросах. " присутствующий в старом RFC 2616 был удален.
Также RFC 7231 говорит об этом по теме :
A payload within a GET request message has no defined semantics;
sending a payload body on a GET request might cause some existing
implementations to reject the request.
Так что, по моему мнению, это означает, что вы можете добавить тело сообщения в запрос GET, (и это должно ответить на ваш первоначальный вопрос), но вы должны быть осторожны.Случай, упомянутый в спецификациях, не единственный, о котором вам нужно знать, многие инструменты, клиенты и серверы просто не ожидают тела сообщения и могут вести себя неправильно.Например, в Chrome XMLHttpRequest удалит тело сообщения для GET.
Другая проблема связана с кэшированием.Согласно RFC 7234 .
The primary cache key consists of the request method and target URI
[...]
If a request target is subject to content negotiation, its cache
entry might consist of multiple stored responses, each differentiated
by a secondary key for the values of the original request's selecting
header fields.
Это означает, что запросы с разными телами, но с одинаковыми URL (и, возможно, с выбранными заголовками), будут считаться имеющими одинаковый ответ кешем, даже еслитело сообщения ранее было правильно перенаправлено на сервер.
В конце я думаю, что если возможно, вам следует избегать использования тел сообщений в GET, если только
- Вы не управляете клиентом
- Вы управляете сервером
- Вы знаете о потенциальных прокси, кешах, которые могут мешать
- Вы отключаете кеширование в ответе (на самом деле вы можете () использовать заголовки, чтобы иметь возможность кэшировать, но я не исследовал эту идею должным образом).