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

Ответ

Да, можно. Спецификация HTTP не требует обязательного наличия тела в POST-запросе, хотя он часто используется для передачи данных.

Почему это возможно:

  • Метод HTTP определяется заголовком запроса, а не наличием тела.
  • Заголовок Content-Length: 0 явно указывает на пустое тело.

Примеры:

  1. Сырой HTTP-запрос:
    POST /api/process/start HTTP/1.1
    Host: api.example.com
    Content-Length: 0
    Authorization: Bearer token123
  2. Использование cURL:
    curl -X POST https://api.example.com/action 
     -H "Content-Length: 0" 
     -H "Authorization: Bearer token123"

Типичные сценарии использования POST без тела:

  • Запуск предопределённого процесса на сервере (например, POST /jobs/cleanup).
  • Действия, где все параметры передаются через заголовки или URL.
  • Реализации API, где определённый эндпоинт является «триггером».

Важно: Серверное приложение должно быть спроектировано на обработку таких запросов. В RESTful API POST-запросы без тела могут считаться неидиоматичными.

Ответ 18+ 🔞

А, слушай, вот это прикол! Люди думают, что POST-запрос — это обязательно какой-то километровый JSON в теле надо впендюрить. А на самом деле, блядь, можно и пустой отправить, и всё будет работать, ёпта!

Почему так, спросишь? Да потому что метод-то определяется в заголовке строчкой POST, а не тем, что у тебя в теле болтается. Главное — явно сказать, что тело пустое, вот этим самым заголовком Content-Length: 0. Без него сервер может тупить, ждать, пока ты ему что-то пришлёшь, и в итоге таймаут словить. А так — всё чётко, ноль байт, жди нихуя.

Смотри, как это выглядит, если ты древний сетевик:

POST /api/do-magic HTTP/1.1
Host: example.com
Content-Length: 0
X-Trigger-Me: please

Вот и весь запрос, сука! Никакого тела, чистая сигнальная ракета.

А через curl это вообще одна строка:

curl -X POST https://example.com/activate -H "Content-Length: 0"

Красота, блядь!

И где это, спрашивается, может пригодиться? Да полно где!

  • Триггер какого-нибудь долбодейства на сервере. Типа POST /server/reboot. Нахуя туда тело пихать? Просто команда: «ребутанись, сука!».
  • Подтверждение действия, где все параметры уже в заголовках зашиты или в URL.
  • Просто такая, блядь, причуда разработчика API. Сделал эндпоинт-кнопку, которая просто что-то делает, и всё.

Но предупреждаю сразу, чувак: это не значит, что так надо везде писать. Если ты делаешь REST API для других, то POST без тела — это как прийти в ресторан, заказать "пожалуйста" и ждать, когда тебе что-нибудь принесут. Официант, блядь, обосрётся от удивления. Серверное приложение должно быть готово к такому распиздяйству. А в классическом REST — это моветон, так что без реальной нужды не выёбывайся.

Короче, технически — да, можно. Практически — смотри по обстановке, чтобы не выглядеть конченым мудаком в глазах того, кто твой API будет потом использовать.