Основы HTTP: методы, статусы, заголовки

HTTP — это договор между клиентом и сервером: методы, пути, статусы и заголовки.
«Каждый запрос — это короткое письмо: глагол (что сделать), адрес (с чем) и, иногда, содержимое.»

Express работает по протоколу HTTP, поэтому без понимания его основ дальше не двинуться. Хорошая новость: модель простая. Клиент отправляет запрос с методом, путём и заголовками, сервер отвечает статусом, заголовками и телом. Всё, что делает Express, — помогает удобно читать запрос и формировать ответ.

В этом уроке мы разложим HTTP на части: методы (GET, POST, PUT, PATCH, DELETE), коды статусов (2xx, 4xx, 5xx) и заголовки. Это словарь, на котором говорит весь веб.

Методы: глаголы запроса

HTTP-метод сообщает серверу намерение клиента. Основные:

МетодСмысл
GETполучить данные, ничего не меняя
POSTсоздать новый ресурс
PUTзаменить ресурс целиком
PATCHчастично обновить ресурс
DELETEудалить ресурс

В Express каждому методу соответствует свой вызов: app.get, app.post, app.put и так далее.

Статусы: ответ сервера

Код статуса в одном числе говорит, что случилось с запросом:

2xx  -> успех          200 OK, 201 Created, 204 No Content
3xx  -> перенаправление 301 Moved, 304 Not Modified
4xx  -> ошибка клиента  400 Bad Request, 401, 403, 404
5xx  -> ошибка сервера  500 Internal, 503 Service Unavailable

Правильный статус — это вежливость к клиенту: по нему фронтенд понимает, что делать дальше, не разбирая текст ответа.

Разбираем строку запроса сами

Чтобы прочувствовать структуру запроса, напишем мини-парсер стартовой строки HTTP прямо в браузере. Express делает это за тебя, но полезно увидеть, из чего она состоит:

function parseRequestLine(line) {
  const [method, url, version] = line.split(' ');
  return { method, url, version };
}

const parsed = parseRequestLine('POST /users/42 HTTP/1.1');
console.log('метод: ', parsed.method);   // POST
console.log('путь:  ', parsed.url);      // /users/42
console.log('версия:', parsed.version);  // HTTP/1.1

Видишь? Запрос — это просто текст по строгим правилам. Express парсит его и кладёт в удобные свойства req.method и req.url.

Как работает под капотом

Когда приходит TCP-соединение, Node читает байты и собирает из них HTTP-сообщение: первую строку (метод, путь, версия), затем заголовки до пустой строки, затем тело. Express получает уже разобранный объект req со свойствами method, url, headers. Ответ строится в обратном порядке: статус-строка, заголовки, тело — и Express помогает собрать всё это методами res.status(), res.set(), res.send().

Частые ошибки

  • Менять данные через GET. GET должен быть безопасным и идемпотентным: повтор запроса не меняет состояние. Для изменений есть POST/PUT/PATCH/DELETE.
  • Всегда отвечать 200. Если ресурс не найден — это 404, если данные кривые — 400. Возврат 200 на ошибку путает клиента.
  • Путать 401 и 403. 401 — "ты не представился", 403 — "представился, но тебе сюда нельзя".

Best practices

  • Выбирай метод по смыслу действия, а не по привычке.
  • Возвращай осмысленный статус: 201 при создании, 204 при удалении без тела.
  • Задавай заголовок Content-Type, чтобы клиент знал формат ответа (Express делает это за тебя при res.json).

Итоги

HTTP — простой и строгий протокол: метод, путь, заголовки, тело — и зеркальный ответ со статусом. Express лишь делает работу с ним удобной. Теперь у тебя есть словарь веба, и мы готовы перейти к маршрутам — главному инструменту Express для ответа на разные запросы.

Идемпотентность и безопасность методов

Два свойства методов стоит запомнить отдельно, потому что на них опирается весь веб. Безопасный метод (GET, HEAD) не меняет состояние сервера — его можно повторять, кэшировать, выполнять параллельно без последствий. Идемпотентный метод (GET, PUT, DELETE) при повторе даёт тот же результат: удалить уже удалённое — всё равно "удалено". POST не идемпотентен: два одинаковых POST создадут два ресурса. Эти свойства — не формальность: на них рассчитывают кэши, прокси и механизмы повторной отправки при сбоях сети. Если нарушить контракт (например, менять данные через GET), сломается не твой код, а инфраструктура вокруг него, и баг будет крайне трудно поймать.

Проверьте себя
1. Какой статус уместен при успешном создании нового ресурса через POST?
A200 OK
B201 Created
C204 No Content
D301 Moved
2. В чём разница между 401 и 403?
A401 — ошибка сервера, 403 — клиента
B401 — не аутентифицирован, 403 — нет прав на ресурс
CЭто синонимы
D403 — ресурс не найден