Какова структура HTTP-запроса с методом POST?

Ответ

Метод POST используется для отправки данных на сервер, обычно для создания нового ресурса. Его структура включает обязательные и опциональные части.

Компоненты POST-запроса:

  1. Стартовая строка: POST <URI> HTTP/<Версия>
  2. Обязательные/рекомендуемые заголовки:
    • Host — домен сервера.
    • Content-Type — формат тела запроса (например, application/json, multipart/form-data).
    • Content-Length — размер тела в байтах.
    • Authorization — данные для аутентификации.
  3. Тело запроса (Body) — содержит передаваемые данные. Формат зависит от Content-Type.

Примеры тел запроса:

JSON (application/json):

{
  "title": "Новая задача",
  "completed": false
}

Форма (application/x-www-form-urlencoded):

title=Новая+задача&completed=false

Form-data (multipart/form-data) — для загрузки файлов.

Полный пример POST-запроса:

POST /api/tasks HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
Content-Length: 46

{"title": "Новая задача", "completed": false}

Важно: В отличие от GET, параметры POST передаются в теле, а не в URL, что безопаснее для конфиденциальных данных и позволяет отправлять большие объемы информации.

Ответ 18+ 🔞

Давай разберём эту штуку, которая POST, как будто ты впервые в жизни видишь, как серверу что-то отправить. Представь, что ты не просто спрашиваешь у сервера "дай поглядеть" (GET), а ты ему суёшь в руки какую-то хуйню со словами "на, прими это и сделай что-нибудь".

Из чего эта конструкция состоит:

  1. Первая строчка — стартовая. Это как крикнуть в пустоту: "Эй, слушай сюда! Я сейчас буду отправлять (POST) вот по этому адресу (/api/tasks) и говорю на языке версии HTTP/1.1!" Без этого — нихуя не понятно, что ты хочешь.

  2. Заголовки — это как сопроводительная записка. Без них сервер посмотрит на твою посылку и скажет: "А это чё за пакет? Кто отправил? Что внутри? Нахуй мне это?" Поэтому обязательно указываем:

    • Host — куда, собственно, стучимся. Без этого — вообще пиздец, куда идти-то?
    • Content-Type — а это, блядь, самое главное! Ты же должен объяснить, в каком формате ты засунул данные в коробку. JSON? Форма? Файлы? Сервер не телепат, ёпта.
    • Content-Length — просто приличный тон. Говоришь, сколько байт весит твоя посылка, чтобы сервер не ждал до второго пришествия.
    • Authorization — это типа пропуск. "Я свой, вот мой токен, не бей".
  3. Тело запроса (Body) — это и есть та самая хуйня, которую ты отправляешь. Вот тут-то и лежат твои данные. Как ты их упакуешь — зависит от того, что ты написал в Content-Type.

Примеры упаковки этой самой хуйни:

JSON (application/json) — сейчас все так делают, модно:

{
  "title": "Новая задача",
  "completed": false
}

Старая-добрая форма (application/x-www-form-urlencoded) — как в древних HTML-формах:

title=Новая+задача&completed=false

Form-data (multipart/form-data) — когда нужно запихнуть в посылку не только текст, но и файл (картинку, документ). Тут уже сложнее, коробка на части делится.

А вот как это всё вместе выглядит, когда собрано в кучу:

POST /api/tasks HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
Content-Length: 46

{"title": "Новая задача", "completed": false}

И главное, нахуй, отличие от GET: При GET ты все параметры (типа ?id=123&name=Vasya) лепишь прямо в адресную строку, как дурак. Все видят, всё в истории браузера, да и длины мало. А POST — он умный, он всё прячет внутрь тела запроса. Никто в логах просто так не увидит твой пароль, и отправить можно овердохуища данных. Красота!