Из каких основных частей состоит HTTP-запрос?

Ответ

HTTP-запрос — это структурированное сообщение, которое клиент (например, браузер или программа) отправляет серверу. Он состоит из стартовой строки, заголовков и опционального тела.

Структура HTTP-запроса:

  1. Стартовая строка (Request Line)

    • Содержит три элемента, разделенных пробелами:
      • Метод (HTTP Method): Глагол, определяющий желаемое действие (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS).
      • Путь к ресурсу (Path/Endpoint): URL-путь на сервере (например, /api/v1/users).
      • Версия протокола (HTTP Version): Обычно HTTP/1.1 или HTTP/2.
    • Пример: GET /api/products/123 HTTP/1.1
  2. Заголовки (Headers)

    • Метаданные запроса в формате Ключ: Значение. Каждый заголовок — на новой строке.
    • Ключевые заголовки:
      • Host: Домен сервера (обязательный для HTTP/1.1).
      • User-Agent: Информация о клиенте (браузер, библиотека).
      • Content-Type: Тип данных в теле запроса (например, application/json, application/x-www-form-urlencoded).
      • Authorization: Учетные данные для доступа (например, Bearer <token>, Basic <credentials>).
      • Accept: Типы контента, которые клиент может обработать (например, application/json).
  3. Пустая строка (Empty Line)

    • Обязательная пустая строка, отделяющая заголовки от тела.
  4. Тело запроса (Request Body)

    • Опциональная часть. Содержит данные, отправляемые на сервер.
    • Используется в методах POST, PUT, PATCH.
    • Формат определяется заголовком Content-Type.

Параметры запроса могут передаваться двумя способами:

  • Query Parameters (Параметры строки запроса): Добавляются в URL после ? в формате key=value, разделенные &. Пример: GET /search?q=term&limit=10.
  • Path Parameters (Параметры пути): Часть самого URL-пути. Пример: GET /users/{userId} где {userId} — параметр.

Примеры сырых HTTP-запросов:

GET-запрос (без тела) с параметрами:

GET /api/search?category=books&sort=price HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

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

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

{"name": "Alice", "email": "alice@example.com"}

POST-запрос с данными формы:

POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

username=admin&password=secret

Ответ 18+ 🔞

А, ну вот, смотри, блядь, сейчас объясню, как эта штука работает, чтобы ты не ходил, как мартышлюшка, по охуенно тонкому льду, не понимая, куда что летит.

HTTP-запрос — это, по сути, такая бумажка, которую ты, как клиент (браузер твой тупой или программа), суёшь серверу под дверь. Состоит она из трёх кусков: приветствия, шапки и, иногда, самого письма.

Из чего эта хуйня собрана:

  1. Стартовая строка (Request Line)

    • Три слова через пробел, как заклинание, блядь:
      • Метод (HTTP Method): Что ты хочешь сделать — забрать (GET), отправить (POST), заменить (PUT), удалить (DELETE), подправить (PATCH), посмотреть шапку (HEAD) или узнать, что можно (OPTIONS).
      • Путь (Path/Endpoint): Куда ты лезешь на сервере (типа /api/v1/users).
      • Версия протокола (HTTP Version): Обычно HTTP/1.1 или HTTP/2. Без неё никуда.
    • Пример: GET /api/products/123 HTTP/1.1 — «Дай мне, блядь, товар номер 123».
  2. Заголовки (Headers)

    • Это как сопроводиловка, метаданные в формате Ключ: Значение. Каждая строчка — отдельный прикол.
    • Основные, на которые смотреть:
      • Host: Адрес сервера (обязательно для HTTP/1.1, а то он нихуя не поймёт).
      • User-Agent: Кто ты такой (браузер, библиотека, скрипт).
      • Content-Type: Какого хрена в теле запроса лежит (application/json, application/x-www-form-urlencoded).
      • Authorization: Твой пропуск, если доступ закрыт (Bearer <токен>, Basic <логин:пароль>).
      • Accept: Что ты, как клиент, готов принять в ответ (application/json, text/html).
  3. Пустая строка (Empty Line)

    • Обязательная пустая строчка! Без неё сервер подумает, что шапка — это тело, и будет пиздец, доверия ебать ноль. Отделяет заголовки от тела.
  4. Тело запроса (Request Body)

    • Необязательная часть. Собственно, само письмо, данные.
    • Нужно для методов POST, PUT, PATCH.
    • Какого формата письмо — смотри в заголовке Content-Type.

Параметры можно впендюрить двумя способами:

  • Query Parameters (Параметры строки запроса): Лепятся к URL после знака ? в виде ключ=значение, через &. Пример: GET /search?q=термин&limit=10 — «Найди «термин», но не больше 10 штук, а то овердохуища будет».
  • Path Parameters (Параметры пути): Сидят прямо в самом пути URL. Пример: GET /users/{userId} — где {userId} это и есть тот самый параметр, который подставится.

Вот тебе примеры, как это выглядит вживую, без прикрас:

GET-запрос (без тела) с параметрами в строке:

GET /api/search?category=books&sort=price HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

(Тут пустая строка после заголовков, тела нет)

POST-запрос с телом в формате JSON (классика для API):

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

{"name": "Alice", "email": "alice@example.com"}

POST-запрос с данными формы (как из старой доброй HTML-формы):

POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

username=admin&password=secret

Вот и вся магия, ёпта. Отправил такую структуру — получи ответ. Не отправил — сиди, блядь, в ошибках.