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.