Web & API

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-сервер