Из чего состоит структура HTTP-запроса?

«Из чего состоит структура HTTP-запроса?» — вопрос из категории Сети, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HTTP-запрос, который обрабатывает Node.js-сервер, состоит из трёх основных частей:

1. Стартовая строка (Request Line): Содержит метод, путь запроса и версию протокола. GET /api/users?active=true HTTP/1.1

  • Метод: GET, POST, PUT, DELETE, PATCH и др.
  • Путь (Path): URL-адрес ресурса, часто с параметрами пути (например, /api/users/:id).
  • Версия протокола: Обычно HTTP/1.1 или HTTP/2.

2. Заголовки (Headers): Метаданные запроса в формате Ключ: Значение. В Node.js они доступны в объекте req.headers.

Host: example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
User-Agent: Mozilla/5.0
Accept: application/json

3. Тело запроса (Body): Необязательная часть, присутствует в POST, PUT, PATCH запросах. Содержит передаваемые данные (JSON, форма, файлы).

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

Пример разбора в чистом Node.js:

const http = require('http');

const server = http.createServer((req, res) => {
  // 1. Стартовая строка
  const { method, url } = req;
  console.log(`[${method}] ${url}`);

  // 2. Заголовки
  console.log('Headers:', req.headers['content-type']);

  // 3. Тело (собирается по частям)
  let body = [];
  req.on('data', chunk => body.push(chunk));
  req.on('end', () => {
    body = Buffer.concat(body).toString();
    console.log('Body:', body);
    // Парсинг JSON, если заголовок верный
    if (req.headers['content-type'] === 'application/json') {
      const data = JSON.parse(body);
      console.log('Parsed data:', data);
    }
    res.end('OK');
  });
});

server.listen(3000, () => console.log('Сервер слушает порт 3000'));

В фреймворках типа Express эта структура абстрагирована: req.method, req.path, req.headers, req.body.