HTTP
HyperText Transfer Protocol — протокол, по которому браузеры и приложения запрашивают данные у серверов: запрос, ответ и ничего между ними.
Что такое HTTP
HTTP расшифровывается как HyperText Transfer Protocol — протокол передачи гипертекста. Это правила разговора клиента и сервера: клиент шлёт запрос, сервер возвращает ответ. На нём держится весь веб и подавляющее большинство API.
Написание «нттр» — не другой протокол, а тот же HTTP, набранный в русской раскладке: латинские h, t, p на клавиатуре совпадают с н, т, р.
Главное свойство протокола — отсутствие состояния (stateless). Сервер не помнит предыдущий запрос: каждый приходит сам по себе. Поэтому «вы вошли в аккаунт» — это не память сервера, а куки или токен, которые клиент прикладывает к каждому запросу заново.
Что такое HTTPS
HTTPS — тот же HTTP, но внутри шифрованного канала TLS (буква S — Secure). Протокол не меняется: те же методы, заголовки и коды, просто трафик неразличим для того, кто сидит между вами и сервером.
Простыми словами: HTTP — открытка, её прочитает любой почтальон по дороге. HTTPS — запечатанный конверт. Шифрование даёт три вещи сразу: провайдер и владелец Wi-Fi не видят содержимое, никто не подменит страницу на лету, а SSL-сертификат подтверждает, что сервер действительно принадлежит этому домену. По умолчанию HTTP работает на порту 80, HTTPS — на 443.
Из чего состоит HTTP-запрос
Запрос — обычный текст из четырёх частей:
POST /v1/orders HTTP/1.1 ← стартовая строка: метод, путь, версия
Host: api.example.com ← заголовки
Authorization: Bearer eyJhbG...
Content-Type: application/json
Content-Length: 34
← пустая строка: конец заголовков
{"sku": "GPU-4090", "qty": 1} ← тело запроса
Тело запроса (request body) — данные, которые клиент отправляет серверу: JSON API, содержимое формы, загружаемый файл. Тело есть не всегда: у GET и DELETE его обычно нет — там всё передаётся в пути и query-параметрах. Формат тела объявляет заголовок Content-Type, и сервер верит ему: пришлёте JSON с Content-Type: text/plain — получите ошибку разбора.
Ответ устроен так же: статусная строка, заголовки, пустая строка, тело.
HTTP/1.1 201 Created
Content-Type: application/json
{"order_id": "A-1042", "status": "new"}
Посмотреть это вживую проще всего через curl -v — он печатает и запрос, и ответ целиком, а curl -i показывает только заголовки ответа.
Методы
| Метод | Смысл | Тело | Меняет данные |
|---|---|---|---|
GET |
получить ресурс | нет | нет |
POST |
создать, отправить данные | да | да |
PUT |
заменить целиком | да | да |
PATCH |
изменить часть полей | да | да |
DELETE |
удалить | обычно нет | да |
HEAD |
только заголовки, без тела | нет | нет |
OPTIONS |
какие методы разрешены | нет | нет — используется в CORS |
Сервер не обязан соблюдать смысл метода — это соглашение. Но нарушать его дорого: GET, меняющий данные, будет вызван краулером или префетчем браузера без ведома пользователя.
Коды ответа
Первая цифра задаёт класс: 2xx — успех, 3xx — редирект, 4xx — ошибка клиента, 5xx — ошибка сервера. Подробный разбор частых кодов — на странице HTTP-ошибки.
Версии
| Версия | Что изменилось | Транспорт |
|---|---|---|
| HTTP/1.1 | текстовый, keep-alive, один запрос за раз в соединении | TCP |
| HTTP/2 | бинарный, мультиплексирование, сжатие заголовков | TCP |
| HTTP/3 | тот же HTTP/2 поверх QUIC, без блокировки очереди | UDP |
Смысл запросов при этом не меняется — переписывается только то, как байты едут по проводу. Включение HTTP/2 на Nginx — это одна директива, приложение о нём даже не знает. Для gRPC HTTP/2 обязателен: на нём построен стриминг.
Связанные термины
- API — что строят поверх HTTP
- HTTP-ошибки — расшифровка кодов ответа
- URI и query-параметры — адрес в стартовой строке запроса
- TLS — то, что превращает HTTP в HTTPS
- REST API — самый частый стиль API поверх HTTP
- WebSocket — постоянное соединение вместо запрос-ответ
Готовы запустить GPU-задачу?
Запустить GPU-сервер