Основы 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), сломается не твой код, а инфраструктура вокруг него, и баг будет крайне трудно поймать.