Компьютерные сети
HTTP: язык веба
Когда вы открываете google.com, браузер отправляет текстовое сообщение «GET / HTTP/1.1» и получает HTML страницы. Этот простой текстовый протокол - основа всего веба, от поисковиков до банкинга.
- **API разработка:** понимание методов и статусов - основа REST API
- **Отладка:** curl и DevTools показывают сырые HTTP-запросы
- **Производительность:** правильные заголовки = кеширование и скорость
Предварительные знания
Протокол HTTP
**HTTP** (HyperText Transfer Protocol) - текстовый протокол прикладного уровня. Работает поверх TCP (порт 80) или TLS (порт 443). Клиент отправляет запрос - сервер возвращает ответ. Каждый запрос независим - HTTP не хранит состояние между запросами.
**Stateless** означает: сервер не помнит предыдущие запросы. Каждый запрос содержит всё необходимое (куки, токены). Это упрощает масштабирование - любой сервер может обработать любой запрос.
**Версии HTTP:** HTTP/0.9 (1991) - только GET. HTTP/1.0 (1996) - заголовки, методы. HTTP/1.1 (1997) - keep-alive, chunked. HTTP/2 (2015) - бинарный, streams. HTTP/3 (2022) - QUIC вместо TCP.
Почему HTTP называют stateless протоколом?
Запрос и ответ
**HTTP-запрос** состоит из: стартовой строки (метод + путь + версия), заголовков и опционального тела. **HTTP-ответ**: стартовая строка (версия + статус-код + фраза), заголовки и тело. Заголовки и тело разделены пустой строкой.
**Content-Length** - размер тела в байтах. Альтернатива: `Transfer-Encoding: chunked` - тело приходит частями, размер заранее неизвестен. Используется для стриминга и динамического контента.
Что разделяет заголовки и тело в HTTP-сообщении?
HTTP-методы
**Метод** указывает действие над ресурсом. GET - получить, POST - создать, PUT - заменить, PATCH - частично изменить, DELETE - удалить. Методы делятся на безопасные (не меняют данные) и идемпотентные (повтор даёт тот же результат).
**Почему DELETE идемпотентен?** Удалить ресурс 1 раз или 10 раз - результат один: ресурса нет. А POST не идемпотентен: каждый вызов создаёт новый ресурс (например, 10 заказов вместо одного).
Какой метод НЕ является идемпотентным?
Статус-коды
**Статус-код** - трёхзначное число, указывающее результат запроса. Первая цифра определяет класс: 1xx - информационные, 2xx - успех, 3xx - перенаправление, 4xx - ошибка клиента, 5xx - ошибка сервера.
**401 vs 403:** 401 Unauthorized означает «кто ты?» - нужно залогиниться. 403 Forbidden означает «я тебя знаю, но нельзя» - даже с авторизацией доступ закрыт. Название 401 исторически неточное.
HTTP-запросы всегда требуют тела
GET, HEAD, DELETE обычно без тела; POST, PUT, PATCH - с телом
Метод определяет семантику. GET запрашивает данные - ему нечего отправлять. POST создаёт - ему нужно передать данные. Технически тело можно добавить к любому запросу, но это нарушает семантику.
Клиент получил код 304. Что это значит?
Ключевые идеи
- **HTTP = текстовый протокол** поверх TCP, stateless (без состояния)
- **Запрос:** метод + путь + заголовки + тело; **Ответ:** статус + заголовки + тело
- **Методы:** GET/POST/PUT/DELETE - действия; идемпотентность важна для retry
- **Статус-коды:** 2xx успех, 3xx редирект, 4xx ошибка клиента, 5xx ошибка сервера
Связанные темы
HTTP - фундамент веб-разработки:
- HTTP заголовки — Детальнее про Content-Type, Cache-Control, Cookies
- HTTPS и TLS — Шифрование HTTP-трафика
- TCP — Транспорт, поверх которого работает HTTP
Вопросы для размышления
- Почему REST API используют разные методы, а не только POST?
- Как stateless влияет на масштабирование веб-приложений?
- Почему важно возвращать правильные статус-коды в API?