Глава 5
REST API
Разбираемся что такое API и REST, изучаем шесть принципов архитектуры
и учимся читать эндпоинты в конфигах nginx и логах сервера.
📖 ~20 мин
⚡ Основы
Что такое API
API (Application Programming Interface) — интерфейс через который одна программа
общается с другой. Не визуальный интерфейс для человека, а программный — набор правил и точек входа
через которые можно отправить запрос и получить ответ.
🍽️
Аналогия: официант в ресторане
Ты не идёшь на кухню сам — ты общаешься через официанта. Говоришь что хочешь, официант
передаёт на кухню, кухня готовит, официант приносит результат. Официант — это API. Он скрывает
внутреннюю кухню и предоставляет понятный способ взаимодействия. Ты не знаешь как именно
повар готовит блюдо — тебе достаточно знать меню и формат заказа.
Примеры API из жизни
🌤️
Погодный сервис
Приложение не измеряет температуру само — отправляет запрос к API и получает данные. Как сервис собирает их с метеостанций — не его дело.
💳
Платёжная система
Интернет-магазин не процессит платежи сам — вызывает API платёжного шлюза. Вся логика процессинга скрыта за API.
🗺️
Карты
Сайт не рисует карту сам — отправляет координаты в API картографического сервиса и получает готовые тайлы и маршрут.
GET /api/weather?city=Moscow HTTP/1.1
← Ответ:
{
"city": "Moscow",
"temp": 22,
"condition": "sunny"
}
Общий паттерн: одна система делает запрос, другая обрабатывает и возвращает результат.
API — контракт между ними: что можно запросить, в каком формате, что придёт в ответ.
API бывают разные
REST
REST API
Самый распространённый стиль. Использует HTTP, работает с ресурсами через стандартные методы. Именно его разберём в этой главе — он построен на всём что мы изучили раньше.
SOAP
SOAP
Старый протокол на основе XML. Строгая схема, WSDL-описания. Встречается в банках, госсервисах, корпоративных интеграциях построенных 10–15 лет назад.
GraphQL
GraphQL
Клиент сам описывает какие данные ему нужны в одном запросе. Решает проблему «получил слишком много» или «слишком мало» данных.
gRPC
gRPC
Бинарный протокол от Google на основе Protocol Buffers. Быстрый, используется для межсервисного общения внутри инфраструктуры.
WebSocket
WebSocket
Двусторонний канал — сервер может сам отправлять данные клиенту без запроса. Чаты, биржевые котировки, онлайн-игры.
Что такое REST
REST (Representational State Transfer) — архитектурный стиль для построения
веб-сервисов. Не протокол, не стандарт, не библиотека — именно стиль. Набор принципов
которые описывают как должно быть организовано взаимодействие между клиентом и сервером.
REST описал Рой Филдинг в 2000 году в докторской диссертации. Филдинг — один
из авторов спецификации HTTP/1.1. Он не придумывал новый протокол — взял HTTP и сформулировал
правила при соблюдении которых система получается масштабируемой, простой и надёжной.
Ключевая идея: всё есть ресурс. Пользователь — ресурс. Заказ — ресурс.
Статья — ресурс. У каждого ресурса есть уникальный адрес (URL) и с ним можно выполнять
стандартные операции через HTTP-методы.
Ресурс «пользователь с id 42» — все операции через URL + метод
GET
/api/users/42
→
получить пользователя
PUT
/api/users/42
→
заменить данные целиком
PATCH
/api/users/42
→
обновить часть данных
DELETE
/api/users/42
→
удалить пользователя
Не нужно придумывать специальные команды вроде getUserById или removeUser —
стандартные HTTP-методы уже описывают действие. URL указывает с чем,
метод указывает что делать.
Шесть принципов REST
Филдинг сформулировал шесть ограничений. Система которая соблюдает их — RESTful.
На практике мало кто соблюдает все шесть буквально, но понимать их нужно — они объясняют
почему REST-системы спроектированы именно так.
🔀
Client-Server
Разделение клиента и сервера
Клиент и сервер — независимые компоненты. Клиент не знает как устроено хранилище данных.
Сервер не знает как выглядит интерфейс. Общаются только через API.
Можно менять одно не трогая другое. Мобильное приложение и веб-сайт используют один и тот же API.
🔁
Stateless
Без состояния
Каждый запрос содержит всю необходимую информацию. Сервер не помнит
кто ты и что делал раньше. Токен передаётся в каждом запросе — сервер проверяет его каждый раз заново.
Любой сервер из пула обработает любой запрос. Горизонтальное масштабирование без проблем.
🗄️
Cacheable
Кешируемость
Ответы должны явно указывать — можно их кешировать или нет.
Если можно — клиент или промежуточный прокси повторно использует сохранённый ответ
вместо нового запроса. Связь с главой 2: Cache-Control — реализация этого принципа.
Снижает нагрузку на сервер, ускоряет ответ для клиента.
📐
Uniform Interface
Единый интерфейс
Самый важный принцип. Одни и те же правила для любого ресурса — URL идентифицирует ресурс,
метод определяет действие, заголовки описывают формат. Каждое сообщение самодостаточно.
Предсказуемость — зная правила, понимаешь любое API.
🏗️
Layered System
Многоуровневая архитектура
Клиент не знает обращается ли он к конечному серверу или к промежуточному звену.
Между клиентом и бэкендом может стоять цепочка посредников — это именно то что мы
разобрали в главе 4 (HAProxy → nginx → бэкенд).
Можно добавлять слои не меняя клиент и бэкенд.
📦
Code on Demand
Код по требованию (опционально)
Сервер может передать клиенту исполняемый код. Единственный опциональный принцип —
система RESTful и без него. Пример: сервер отдаёт HTML с тегом
<script> — браузер получает и выполняет JavaScript.
Расширяемость клиента без обновления.
ℹ️
Stateful vs Stateless
Классический пример stateful-системы — серверная сессия. Сервер хранит объект сессии в памяти
и привязывает к нему session_id. Если запрос попадёт на другой сервер — там этой сессии нет.
Нужна либо «липкая» балансировка (ip-hash), либо общее хранилище (Redis).
REST-подход избегает этой проблемы по дизайну — вся информация в самом запросе.
Ответственность слоёв
Принцип Layered System — не просто теория. В реальной инфраструктуре он определяет
кто за что отвечает. Каждый слой делает своё дело и не лезет в чужое.
HAProxy
10.0.0.1
Балансировщик
Делает
Балансировка нагрузки
Высокая доступность
Failover
TLS-терминация
Фильтрация атак
Бизнес-логика
nginx
10.0.0.5
Реверс-прокси
Делает
TLS-терминация
Маршрутизация по URL
Отдача статики
Балансировка между ЦОД
Бизнес-логика
Бэкенд
10.1.11.35
Приложение
Делает
Бизнес-логика
Работа с базой данных
REST API
TLS
Балансировка
Почему это важно:
- Независимость обновлений. Обновление nginx не требует перезапуска бэкенда. Замена алгоритма балансировки в HAProxy не трогает ни nginx, ни бэкенд.
- Чёткие зоны ответственности. Запросы распределяются неравномерно — проблема HAProxy. Сертификат не обновился — проблема nginx. API возвращает неправильные данные — проблема бэкенда.
- Масштабирование по слоям. Нагрузка выросла — добавляешь бэкенд-серверы, HAProxy распределит на них трафик. nginx и бэкенды не знают друг о друге напрямую.
💡
Ограничение: задержка на каждом слое
Каждый слой добавляет сетевой хоп. Запрос проходит HAProxy → nginx → бэкенд — три перехода
вместо одного. В большинстве инфраструктур это единицы миллисекунд (компоненты в одном ЦОД),
но знать об этом нужно при диагностике.
REST на практике: как читать эндпоинты
В повседневной работе ты сталкиваешься с конкретными URL-ами в конфигах nginx и логах.
Нужно уметь читать их и понимать структуру.
Структура URL в REST API
Разбор типичного REST URL
https://api.example.com/api/v1/users/42/orders?status=active&limit=10
httpsсхема
api.example.comхост
/api/v1версия
/usersколлекция
/42id ресурса
/ordersвложенный
?status=active&limit=10query-параметры
- Коллекция — существительное во множественном числе:
/users, /orders, /products
- Конкретный ресурс — коллекция + идентификатор:
/users/42
- Вложенные ресурсы — иерархия принадлежности:
/users/42/orders — заказы конкретного пользователя
- Версионирование —
/v1/, /v2/ — позволяет менять API не ломая старых клиентов
- Query-параметры — фильтрация, сортировка, пагинация:
?status=active&page=2&limit=20
Метод + URL = действие
GET/api/v1/usersполучить список пользователей
POST/api/v1/usersсоздать нового пользователя
GET/api/v1/users/42получить пользователя с id 42
PUT/api/v1/users/42заменить данные пользователя
PATCH/api/v1/users/42обновить часть данных
DELETE/api/v1/users/42удалить пользователя
GET/api/v1/users/42/ordersзаказы пользователя 42
POST/api/v1/users/42/ordersсоздать заказ для пользователя 42
Как это выглядит в nginx
location /api/v1/ {
proxy_pass http://backend-v1; # бэкенд версии 1
}
location /api/v2/ {
proxy_pass http://backend-v2; # бэкенд версии 2
}
location /static/ {
root /var/www; # статика с диска
}
Как читать логи
185.220.101.42 - - [21/Jun/2026:10:15:03] "GET /api/v1/users/42 HTTP/1.1" 200 342
↑ запрос пользователя 42 — получение профиля, успешно (200)
185.220.101.42 - - [21/Jun/2026:10:15:04] "DELETE /api/v1/users/42 HTTP/1.1" 403 89
↑ попытка удаления — отклонено (403 Forbidden: нет прав)
10.0.0.1 - - [21/Jun/2026:10:15:05] "POST /api/v1/users HTTP/1.1" 201 156
↑ создание нового пользователя от HAProxy (10.0.0.1) — успешно (201 Created)
Понимая REST, ты сразу читаешь что происходит — без документации.
Без понимания структуры это просто набор символов.
Итог
API — программный интерфейс через который системы общаются друг с другом.
REST — архитектурный стиль построения API поверх HTTP, основанный на работе
с ресурсами через стандартные методы.
| Принцип | Суть | Что даёт |
| Client-Server |
Клиент и сервер независимы |
Можно менять одно не трогая другое |
| Stateless |
Каждый запрос самодостаточен |
Горизонтальное масштабирование |
| Cacheable |
Ответы помечаются как кешируемые |
Снижение нагрузки |
| Uniform Interface |
Единые правила для всех ресурсов |
Предсказуемость и простота |
| Layered System |
Промежуточные слои прозрачны |
Гибкость инфраструктуры |
| Code on Demand |
Сервер может прислать код (опционально) |
Расширяемость |
Всё что мы изучили в главах 1–4 — методы, заголовки, коды ответов, TLS, проксирование —
это инструменты на которых REST построен. REST не добавляет ничего нового к HTTP —
он описывает как использовать HTTP правильно.