Раздел 11 · Network

HTTP с нуля: запрос, методы, статусы, cookies

junior~35 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

HTTP с нуля: запрос, методы, статусы, cookies

Ты уже сто раз дёргал fetch и видел 200 OK. Этот урок переворачивает картинку: HTTP это не магия браузера, а простой текстовый протокол, который ты можешь набрать руками в терминале. Когда понимаешь, из чего собран запрос, перестаёшь гадать, почему сервер вернул 403 вместо 401, и почему форма улетела не туда.

Раздел открывается с самого низа стека прикладного уровня и идёт вглубь: сегодня HTTP как текст, дальше потоковые протоколы, потом транспорт и TLS, в конце эволюция до HTTP/3.

Идея: HTTP это текст и пара ролей

HTTP устроен предельно просто. Есть две роли: клиент шлёт запрос, сервер шлёт ответ. Один запрос, один ответ. Никакого состояния между ними протокол сам по себе не хранит, он stateless.

Запрос это просто текст из трёх частей:

GET /search?q=cats HTTP/1.1
Host: example.com
User-Agent: curl/8.4.0
Accept: text/html
  1. Стартовая строка: метод, путь с query, версия протокола.
  2. Заголовки: пары Имя: значение, по одной на строку.
  3. Пустая строка, затем тело (у GET тела обычно нет).

Ответ симметричен:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1256

<!doctype html>...

Стартовая строка ответа несёт версию, числовой статус-код и его текстовое имя (OK, Not Found). Всё.

Демонстрация: набираем запрос руками

Лучший способ поверить, что это текст, набрать его самому. Открой терминал:

# самый честный способ увидеть сырой обмен
curl -v https://example.com

# совсем руками, без curl: открываем TCP и печатаем запрос
printf 'GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n' \
  | nc example.com 80

В выводе curl -v строки с > это то, что ушло на сервер, строки с < это ответ. Обрати внимание на \r\n в ручном варианте: HTTP требует именно CRLF как разделитель строк, а пустая строка \r\n\r\n отделяет заголовки от тела.

Методы: глаголы и их обещания

Метод это глагол. Он говорит серверу, что ты хочешь сделать с ресурсом по указанному пути. Важны не сами буквы, а два свойства, которые метод обещает.

  • Safe: метод ничего не меняет. Прочитал и ушёл.
  • Idempotent: повтор не добавляет эффекта.
МетодSafeIdempotentЗачем
GETдадапрочитать ресурс
HEADдадакак GET, но только заголовки, без тела
OPTIONSдадаспросить, что разрешено (используется CORS preflight)
POSTнетнетсоздать, отправить, запустить действие
PUTнетдаполностью заменить ресурс
PATCHнетнетчастично изменить ресурс
DELETEнетдаудалить ресурс

Почему это не занудство, а основа надёжности: если сеть моргнула и ответ потерялся, клиент может безопасно повторить GET, PUT или DELETE. А вот POST повторять опасно, можно создать дубль заказа. Поэтому платёжки и очереди вокруг POST городят ключи идемпотентности.

PUT против PATCH: PUT посылает ресурс целиком и заменяет его, поэтому два одинаковых PUT дают тот же результат. PATCH шлёт только дельту, и повтор дельты может быть неоднозначным (например, increment), поэтому он не идемпотентен по умолчанию.

Статусы: первая цифра решает всё

Не нужно зубрить все коды. Достаточно помнить, что задаёт первая цифра, и держать в голове десяток ходовых.

  • 2xx, успех. 200 OK обычный ответ с телом. 201 Created создали ресурс, в Location адрес нового. 204 No Content успех без тела (типично для DELETE или PUT). 206 Partial Content отдали кусок (докачка, видео).
  • 3xx, перенаправление. 301 переехали навсегда (браузер и поисковик запомнят), 302/303 временно, 304 Not Modified отвечает на условный запрос: у тебя уже свежая копия, бери из кеша. 307/308 строго сохраняют метод и тело при редиректе (в отличие от 301/302, которые исторически превращали POST в GET).
  • 4xx, виноват клиент. 400 кривой запрос, 401 Unauthorized ты не представился (нет или плохой токен), 403 Forbidden представился, но прав нет, 404 ресурса нет, 409 Conflict конфликт состояния (версия устарела), 422 Unprocessable тело синтаксически валидно, но не проходит правила, 429 Too Many Requests тебя притормозили лимитом.
  • 5xx, виноват сервер. 500 упал, 502 Bad Gateway прокси получил мусор от апстрима, 503 Service Unavailable перегружен или на обслуживании, 504 Gateway Timeout апстрим не ответил вовремя.

Главная пара, которую путают на собеседовании: 401 это про аутентификацию (кто ты), 403 это про авторизацию (что тебе можно). Нет токена, 401. Токен есть, но это чужая папка, 403.

дальше после входа

Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.

Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.