← Назад к вопросам

Какая структура у HTTP-запроса?

1.3 Junior🔥 191 комментариев
#API и сетевые протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какая структура у HTTP-запроса?

HTTP запрос состоит из трёх основных частей: Request Line, Headers и Body. Это фундаментальная концепция, которая определяет, как клиент взаимодействует с сервером.

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

POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 27
Authorization: Bearer token123
Accept: application/json

{"name": "John", "email": "j@example.com"}

Компонент 1: Request Line

Request Line — первая строка, которая содержит метод, путь и версию HTTP.

Формат:

[METHOD] [URI] [HTTP_VERSION]

Пример:

POST /api/v1/users HTTP/1.1
GET /products?page=1&limit=10 HTTP/1.1
PUT /articles/123 HTTP/1.1

Компоненты:

  • METHOD — HTTP метод (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, TRACE)
  • URI — адрес ресурса относительно сервера (может содержать query параметры)
  • HTTP_VERSION — версия протокола (HTTP/1.0, HTTP/1.1, HTTP/2, HTTP/3)

Компонент 2: Headers (Заголовки)

Headers — ключ-значение пары, которые предоставляют дополнительную информацию о запросе.

Формат:

Header-Name: Header-Value

Обязательные заголовки:

// Host — обязателен в HTTP/1.1
Host: api.example.com

// Content-Length — размер body в байтах (для методов с body)
Content-Length: 145

// Content-Type — тип данных в body
Content-Type: application/json

Часто используемые заголовки:

// Авторизация
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Authorization: Basic dXNlcjpwYXNz
Authorization: ApiKey sk-12345678

// Контент и кодировка
Content-Type: application/json
Content-Type: application/x-www-form-urlencoded
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
Content-Encoding: gzip
Accept-Encoding: gzip, deflate, br

// Кэширование
Cache-Control: no-cache, no-store, must-revalidate
If-Modified-Since: Wed, 29 Mar 2023 12:00:00 GMT
If-None-Match: "abc123"

// Прочие
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Referer: https://example.com/page
Cookie: session_id=abc123; theme=dark
Accept: application/json
Accept-Language: en-US,en;q=0.9

Важно: Headers заканчиваются двумя переносами строк (CRLF CRLF: \r\n\r\n), которые отделяют их от body.

Компонент 3: Body (Тело запроса)

Body — опциональный компонент, который содержит данные для сервера (JSON, XML, форма, файл и т.д.).

Когда body нужен:

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

Когда body не нужен:

  • GET — получение данных
  • DELETE — удаление ресурса (хотя технически можно отправить)
  • HEAD — аналог GET, но без body в ответе

Полный пример HTTP запроса

Пример 1: GET запрос (без body)

GET /api/v1/users/123?include=posts HTTP/1.1
Host: api.example.com
Accept: application/json
Authorization: Bearer token123
User-Agent: MyApp/1.0

Пример 2: POST запрос (с JSON body)

POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 48
Authorization: Bearer token123

{"name": "John Doe", "email": "john@example.com"}

Пример 3: PATCH запрос (частичное обновление)

PATCH /api/v1/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 22
Authorization: Bearer token123

{"status": "active"}

Пример 4: Multipart (загрузка файла)

POST /api/v1/upload HTTP/1.1
Host: api.example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 345

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg

[binary image data]
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="title"

My Photo
------WebKitFormBoundary7MA4YWxkTrZu0gW--

HTTP методы

МетодНазначениеBodyБезопасныйИдемпотентный
GETПолучить ресурсНетДаДа
POSTСоздать ресурсДаНетНет
PUTЗаменить ресурсДаНетДа
PATCHОбновить ресурсДаНетНет
DELETEУдалить ресурсНетНетДа
HEADКак GET, без bodyНетДаДа
OPTIONSПолучить методыНетДаДа
TRACEТрассировкаНетДаДа

HTTP версии

HTTP/1.0 — каждый запрос требует нового соединения

GET / HTTP/1.0
Host: example.com

HTTP/1.1 — поддерживает Keep-Alive (переиспользование соединения)

GET / HTTP/1.1
Host: example.com
Connection: keep-alive

HTTP/2 — бинарный протокол, мультиплексирование, сжатие заголовков

:method: GET
:path: /
:scheme: https
:authority: example.com

HTTP/3 — QUIC протокол, быстрее, улучшенная надежность

Как выглядит HTTP запрос в Node.js

Использование fetch API:

const response = await fetch('/api/v1/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token123',
    'Accept': 'application/json'
  },
  body: JSON.stringify({ name: 'John', email: 'john@example.com' })
});

const data = await response.json();

Использование axios:

const axios = require('axios');

const response = await axios.post('/api/v1/users', 
  { name: 'John', email: 'john@example.com' },
  {
    headers: {
      'Authorization': 'Bearer token123',
      'Content-Type': 'application/json'
    }
  }
);

Использование Express (на стороне сервера):

app.post('/api/v1/users', (req, res) => {
  // req.method => 'POST'
  // req.url => '/api/v1/users'
  // req.headers => все заголовки
  // req.body => распарсенное body (при использовании middleware)
  
  console.log(req.method); // POST
  console.log(req.headers['content-type']); // application/json
  console.log(req.body); // { name: 'John', ... }
});

Лучшие практики

  1. Всегда устанавливай Content-Type при отправке body
  2. Включай Authorization если запрос требует аутентификации
  3. Используй правильный метод (GET для чтения, POST для создания и т.д.)
  4. Проверяй Content-Length при отправке большого body
  5. Обрабатывай ошибки и проверяй статусы ответов
  6. Используй HTTPS для защиты данных при передаче

Понимание структуры HTTP запроса — это фундамент для работы с REST API и веб-разработкой в целом.

Какая структура у HTTP-запроса? | PrepBro