Всегда ли HTTP-запрос содержит тело (body)?

Ответ

Нет, тело HTTP-запроса присутствует не всегда. Его наличие определяется методом запроса и семантикой операции.

Методы без тела (обычно):

  • GET — запрашивает данные, тело не используется.
  • HEAD — аналогичен GET, но возвращает только заголовки.
  • DELETE — может не иметь тела, если ресурс идентифицируется URL.
  • OPTIONS — запрашивает поддерживаемые методы.

Методы с телом (часто):

  • POST — отправляет данные для создания ресурса.
  • PUT — отправляет данные для полного обновления ресурса.
  • PATCH — отправляет данные для частичного обновления.

Примеры:

Запрос GET без тела:

GET /api/users HTTP/1.1
Host: example.com
Accept: application/json

Запрос POST с телом в формате JSON:

POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 27

{"name": "John", "age": 30}

Почему это важно: Клиенты и серверы оптимизируют обработку, не ожидая тело там, где оно не предусмотрено спецификацией.

Ответ 18+ 🔞

А, ну тут народ частенько путается, будто в каждом запросе этот самый body должен быть, как обязательный довесок. Да не, блядь, не всегда!

Смотри, есть методы, которые в основном летают налегке, без этого багажа:

  • GET — он как любопытный сосед: "Чё там у тебя?", данные запрашивает, а сам нихуя не отдаёт.
  • HEAD — тот же самый GET, только совсем уж скромный: только шапку (заголовки) вернёт, а тело запроса даже не жди.
  • DELETE — бывает и без тела, если всё, что надо стереть с лица сервера, уже указано в адресе (URL).
  • OPTIONS — он просто вежливо интересуется: "А что ты вообще умеешь, сервак?"

А вот эти ребята, они обычно с поклажей:

  • POST — классический "принимаю в дар", тащит данные, чтобы что-то там создать.
  • PUT — "всё старое — нахуй, вот тебе новое", загружает полный набор данных для замены.
  • PATCH — хитрая жопа, "дай-ка я только кусочек исправлю", шлёт только изменения.

Ну, чтобы совсем понятно было, смотри примеры:

Вот GET — лёгкий, пустой, мечта:

GET /api/users HTTP/1.1
Host: example.com
Accept: application/json

А вот POST — уже с полным чемоданом, в формате JSON:

POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 27

{"name": "John", "age": 30}

А почему, спрашивается, это так важно? Да потому что клиенты и серверы, они не дураки, ёпта! Зачем им ждать и парсить тело, если по правилам игры его быть не должно? Оптимизация, блядь, чтоб не ебаться попусту.