HTTP — HyperText Transfer Protocol, протокол передачи гипертекста. Когда вы открываете сайт, между браузером и сервером летят HTTP-сообщения. REST API использует тот же самый HTTP — никакого «отдельного API-протокола» не существует. Это важно: значит, всё, что вы уже знаете про загрузку страниц, применимо и к API-запросам.
Клиент и сервер
HTTP всегда работает в паре «клиент — сервер». Клиент — тот, кто инициирует разговор: браузер, мобильное приложение, скрипт на Python, утилита curl в терминале. Сервер — тот, кто слушает на каком-то адресе и порту, принимает запросы и отвечает.
Сервер сам ничего никому не шлёт. Он молчит, пока кто-то не пришёл с запросом. Это важная асимметрия: если вам нужно, чтобы сервер сам присылал данные (чат, уведомления, котировки) — чистый HTTP не подходит, нужен либо WebSocket, либо хитрые техники вроде long polling. Об этом — в модуле 10.
Запрос → ответ
Любая коммуникация по HTTP — это пара сообщений. Клиент шлёт запрос, сервер шлёт ответ. Точка. Один запрос — один ответ.
Браузер → запрос → Сервер
Браузер ← ответ ← Сервер
Никакой «беседы из нескольких сообщений» в HTTP нет. Хотите получить три разных ресурса — шлёте три отдельных запроса. Каждый из них — самостоятельный разговор. Это и есть то самое «безсостояние» (statelessness) из предыдущей главы.
Запрос внутри
HTTP-запрос — это текстовое сообщение примерно такого вида:
GET /posts/42 HTTP/1.1
Host: api.example.com
Accept: application/json
Authorization: Bearer eyJhbGciOi...
Первая строка — стартовая: метод (GET), путь (/posts/42), версия протокола (HTTP/1.1). Дальше — заголовки: пары «имя: значение», по одной на строку. Они несут метаинформацию — что за хост, какой формат ответа предпочтителен, какой токен авторизации. У запроса может быть ещё тело (body), куда кладутся данные при отправке. У GET-запроса тела обычно нет — всё, что нужно сказать, влезает в URL и заголовки.
Ответ внутри
Ответ устроен похоже:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 137
{"id": 42, "title": "Пример поста", "author": "anna"}
Первая строка — статус: версия протокола, числовой код (200) и текстовое описание (OK). Дальше — заголовки. Потом пустая строка. И — тело ответа: данные в том формате, который указан в Content-Type. В REST API это почти всегда JSON.
HTTPS — это HTTP в защищённой обёртке
HTTPS — это тот же HTTP, только трафик зашифрован TLS. С точки зрения логики запросов и ответов разницы никакой. С точки зрения безопасности — огромная: без HTTPS любой по пути от вас до сервера может прочитать токены, пароли, данные. Современные браузеры на запросы к API без HTTPS реагируют грубо: блокируют, ругаются в консоль, не дают передать куки. Так что в реальной работе если всегда видите https:// — хорошо.
Что из этого важно прямо сейчас
- HTTP — это пара «запрос → ответ».
- Запрос имеет метод, путь, заголовки и иногда тело.
- Ответ имеет статус, заголовки и тело.
- Сервер не запоминает запросы.
Этого достаточно, чтобы перейти к модулю 2, где разберём, что лежит в каждой части запроса и ответа подробнее, и заодно познакомимся с JSON. Кодовые примеры пока писать не будем — первая fetch ждёт в модуле 4.