REST расшифровывается как Representational State Transfer — «передача состояния представления». Это не протокол и не технология, а архитектурный стиль — набор правил для проектирования веб-сервисов.
REST запрос — это обычный HTTP-запрос*, построенный по правилам REST. Клиент (например, мобильное приложение) обращается к серверу, сервер возвращает данные.
Форматом данных чаще всего выступает JSON. XML тоже допустим, но встречается реже.
Основные методы: GET (получить), POST (создать), PUT (обновить целиком), PATCH (обновить частично), DELETE (удалить).
Главный принцип — stateless: сервер не помнит предыдущих обращений. Каждый рест запрос самодостаточен и содержит всю необходимую информацию.
REST ≠ RESTful: REST — концепция, RESTful — реализация, которая строго следует всем принципам REST архитектуры.
Оглавление:
- REST — что это такое и как расшифровывается аббревиатура
- Основные принципы REST архитектуры: шесть ограничений Филдинга
- REST запрос — это что такое: анатомия запроса и ответа
- REST формат данных: JSON, XML и другие варианты
- Рест апи простыми словами: объясняем на понятных примерах
- Правила REST: что делает API по-настоящему RESTful
- REST приложение: примеры и сценарии использования
- Протоколы REST и альтернативы: когда REST — не лучший выбор
- FAQ — Часто задаваемые вопросы о REST
- Мнение эксперта
- Заключение
- Термины и сноски
REST — что это такое и как расшифровывается аббревиатура
Когда разработчик говорит «подключимся через REST», он имеет в виду конкретный подход к организации взаимодействия между программами. Но прежде чем разбираться, как это работает, — разберемся, что вообще означает само слово.
Полная расшифровка аббревиатуры REST на русском языке
REST — это аббревиатура трех английских слов: Representational State Transfer. Дословный перевод — «передача состояния представления». Звучит туманно, поэтому разберем каждое слово отдельно.
| Слово | Оригинал | Что означает |
|---|---|---|
| Representational | Представление | Сервер отдает не сам объект, а его представление — например, JSON-описание товара |
| State | Состояние | Это текущее состояние ресурса в момент запроса — цена, остаток, название |
| Transfer | Передача | Это перемещение представления от сервера к клиенту по сети |
Иными словами, REST описывает, как клиент запрашивает у сервера представление нужного ресурса и получает его в ответ. Ресурсом может быть что угодно: пользователь, заказ, банковский счет, список треков.
REST как расшифровывается теперь понятно — но важно зафиксировать: это именно стиль мышления о взаимодействии систем, а не готовая библиотека или конкретный протокол.
Как появился REST: история Роя Филдинга и диссертация 2000 года
Термин REST ввел американский ученый Рой Филдинг (Roy Fielding) в своей докторской диссертации, опубликованной в 2000 году в Калифорнийском университете Ирвайна. Работа называлась «Архитектурные стили и проектирование сетевых программных архитектур».
Филдинг был одним из авторов спецификации HTTP — он буквально помогал строить протокол, на котором работает веб. Наблюдая, как разработчики используют HTTP нерационально, он сформулировал набор ограничений, которые позволяют делать масштабируемые, надежные и предсказуемые системы. Этот набор он и назвал REST.
Важный нюанс: Филдинг не изобретал ничего принципиально нового. Он описал и формализовал принципы, уже заложенные в архитектуре самого веба. REST — это, по сути, объяснение того, почему веб работает именно так.
REST — это архитектурный стиль, а не протокол: в чем разница
Это одно из самых распространенных заблуждений. REST часто путают с протоколом — как HTTP или FTP. Но протокол задает конкретный формат сообщений и правила их передачи. REST же описывает архитектурные ограничения — то, как должна быть организована система.
Аналогия: протокол — это правила дорожного движения (ехать справа, пропускать пешеходов). REST-стиль — это принципы градостроительства (как расположить дороги, чтобы город не вставал в пробки). Можно ехать по правилам и при этом ехать по плохо спроектированной дороге.
Вот как REST соотносится со смежными понятиями:
| Понятие | Тип | Суть |
|---|---|---|
| HTTP | Протокол | Транспорт, по которому идут рест запросы |
| HTTPS | Протокол | Защищенный HTTP с шифрованием TLS |
| REST | Архитектурный стиль | Набор ограничений для проектирования API* |
| RESTful API | Реализация | Конкретное API, выполняющее все принципы REST |
| SOAP | Протокол | Альтернативный, более строгий подход к обмену данными |
REST подход не привязан только к HTTP — теоретически его можно реализовать поверх другого транспорта. Однако на практике 99% REST-сервисов работают именно через HTTP, потому что этот протокол уже предоставляет все необходимое: методы, заголовки, коды ответов, кэширование.
Именно поэтому, говоря о протоколах REST, правильнее говорить «REST поверх HTTP», а не «REST — это протокол».
Основные принципы REST архитектуры: шесть ограничений Филдинга
Когда Рой Филдинг описывал REST, он говорил именно об ограничениях — constraints. Не о рекомендациях, не о best practices, а об обязательных условиях, без которых система не считается RESTful. Их ровно шесть, и последнее — единственное необязательное.
Понимание этих принципов REST архитектуры отвечает на вопрос: почему REST стал стандартом де-факто для построения веб-сервисов, а не просто модным словом.
Принцип 1 — Клиент-серверная архитектура (Client-Server)
Первый и самый базовый принцип: клиент и сервер существуют отдельно и общаются только через четко определенный интерфейс.
Клиент занимается отображением данных и пользовательским интерфейсом. Сервер — хранением данных и бизнес-логикой. Они ничего не знают о внутреннем устройстве друг друга. Это позволяет развивать фронтенд и бэкенд независимо.
Практический пример: приложение Ozon на смартфоне — это клиент. Оно не знает, на каком языке написан бэкенд Ozon и как устроена их база данных. Клиент просто отправляет рест запросы и получает данные в ответ. Команды фронтенда и бэкенда могут работать параллельно, не блокируя друг друга.
Принцип 2 — Отсутствие состояния (Stateless)
Каждый REST запрос — это самодостаточная единица. Сервер не хранит никакой информации о предыдущих обращениях клиента. Если вы сделали 50 запросов до этого, сервер об этом ничего не знает — он обрабатывает каждый запрос как первый.
Это значит, что вся необходимая информация должна содержаться в самом запросе: токен авторизации, параметры фильтрации, идентификатор пользователя — все это клиент передает каждый раз заново.
| Подход | Где хранится состояние | Пример |
|---|---|---|
| Stateful | На сервере (сессия) | Традиционные сайты с куками |
| Stateless (REST) | В каждом запросе | JWT-токен в заголовке Authorization |
Плюсы stateless очевидны: масштабируемость. Если нагрузка выросла и вы запустили второй сервер, — любой из серверов может обработать любой входящий рест запрос, потому что не нужно синхронизировать состояние сессий. Именно так работают высоконагруженные REST приложения — например, API Яндекс Диска или VK.
Принцип 3 — Кэшируемость (Cacheable)
Сервер обязан явно указывать, можно ли кэшировать ответ на конкретный запрос. Для этого используются HTTP-заголовки — в первую очередь Cache-Control.
Кэширование снижает нагрузку на сервер и ускоряет работу клиента. Если пользователь запросил список категорий товаров на маркетплейсе, браузер или промежуточный прокси может сохранить этот ответ и не делать повторный запрос к серверу — данные вряд ли изменились за последние 5 минут.
Примеры директив Cache-Control:
- Cache-Control: max-age=3600 — ответ можно кэшировать на 1 час
- Cache-Control: no-store — кэшировать запрещено (например, данные банковского счета)
- Cache-Control: private — кэшируется только на стороне клиента, не на прокси
Некэшируемые данные — все, что меняется в реальном времени или содержит персональную информацию. Кэшируемые — справочники, каталоги, статические ресурсы.
Принцип 4 — Единообразие интерфейса (Uniform Interface)
Это главное ограничение, которое отличает REST от любого другого подхода. Оно распадается на четыре подпринципа.
- Идентификация ресурсов через URI. Каждый ресурс имеет уникальный адрес. Пользователь — /users/42, его заказы — /users/42/orders. Ресурс и его представление — разные вещи: сервер хранит данные в базе, но отдает их в виде JSON.
- Управление ресурсом через представление. Клиент получает представление ресурса (например, JSON с данными заказа) и с его помощью может управлять ресурсом — изменять или удалять, отправив измененное представление обратно.
- Самоописывающие сообщения. Каждый запрос и ответ содержит достаточно информации для своей обработки: тип данных указан в заголовке Content-Type, метод — в самом HTTP-запросе, статус — в коде ответа.
- HATEOAS* — Hypermedia As The Engine Of Application State. Самый редко реализуемый подпринцип: сервер в ответе возвращает не только данные, но и ссылки на возможные следующие действия. Это как меню в ресторане: вы получаете блюдо и сразу видите, что можно заказать еще.
На практике HATEOAS реализуют редко — это трудоемко, а большинство клиентов и так знают структуру API из документации. Но концепция важна для понимания REST стиля в его «чистом» виде.
Принцип 5 — Многоуровневая система (Layered System)
Клиент не обязан знать, с кем именно он разговаривает. Между ним и конечным сервером может находиться несколько промежуточных слоев: балансировщик нагрузки, прокси-сервер, CDN, API-шлюз, сервер кэширования.
Каждый слой видит только соседние и не знает об остальных. Это дает гибкость при масштабировании: можно добавить новый слой, не меняя ни клиент, ни конечный сервер.
Пример: когда вы делаете запрос к API VK, он проходит через CDN → балансировщик → API-шлюз → микросервис → базу данных. Клиентское приложение об этой цепочке ничего не знает. Ему все равно — оно получает ответ.
Принцип 6 — Код по требованию (Code on Demand, необязательный)
Единственный опциональный принцип. Сервер может передавать клиенту исполняемый код — например, JavaScript, — который клиент выполняет у себя. Это расширяет функциональность клиента без его предварительного обновления.
В современном вебе это фактически стандарт: браузер загружает JS-скрипты с сервера и выполняет их. Но при проектировании REST API этот принцип применяется редко — большинство REST-клиентов (мобильные приложения, бэкенд-сервисы) не умеют исполнять произвольный код.
Таблица: 6 принципов REST-архитектуры
| Принцип | Обязателен | Суть |
|---|---|---|
| Client-Server | ✅ | Клиент и сервер разделены и независимы |
| Stateless | ✅ | Сервер не хранит состояние между запросами |
| Cacheable | ✅ | Ответы явно помечаются как кэшируемые или нет |
| Uniform Interface | ✅ | Единый стандартизированный интерфейс для всех ресурсов |
| Layered System | ✅ | Между клиентом и сервером может быть несколько слоев |
| Code on Demand | ❌ | Сервер может передавать исполняемый код клиенту |
Если API нарушает хотя бы один из первых пяти принципов — его нельзя называть RESTful. Именно поэтому большинство современных API правильнее называть «REST-подобными»: они следуют духу REST подхода, но редко реализуют его полностью — особенно в части HATEOAS.
REST запрос — это что такое: анатомия запроса и ответа
REST запрос — это не какой-то особый тип сообщения. Это обычный HTTP-запрос, построенный по правилам REST подхода. Разобрать его по частям — значит понять, как вообще работает любое современное веб-взаимодействие: от звонка в поддержку банка через приложение до загрузки фото в VK.
Полный цикл выглядит так: клиент формирует рест запрос → отправляет его по сети → сервер обрабатывает → возвращает ответ с данными и кодом статуса. Каждый шаг имеет четкую структуру.
Из чего состоит REST запрос
HTTP-запрос — а значит, и любой рест запрос — состоит из четырех элементов.
- Метод (Method). Глагол, который говорит серверу, что нужно сделать: получить данные, создать запись, удалить ресурс. Об этом подробнее в следующем блоке.
- URL (Uniform Resource Locator). Адрес ресурса, с которым клиент хочет работать. Например: https://api.ozon.ru/v1/products/12345.
- Заголовки (Headers). Метаданные запроса: кто отправляет, в каком формате ждет ответ, как авторизован. Передаются в виде пар «ключ: значение».
- Тело запроса (Body). Данные, которые клиент отправляет серверу. Есть не у всех методов — GET и DELETE тело, как правило, не используют.
Что такое ресурс в REST и как формируется URL
В REST все вращается вокруг понятия ресурса. Ресурс — это любая сущность, которой можно управлять: пользователь, товар, заказ, статья, банковский счет. Ресурс идентифицируется через URI — уникальный адрес.
Правило простое: URI — это существительное, а не глагол. Метод HTTP уже говорит, что делать. URI говорит, с чем.
| ❌ Плохо | ✅ Хорошо |
|---|---|
| POST /createUser | POST /users |
| GET /getUserById?id=42 | GET /users/42 |
| DELETE /deleteOrder/99 | DELETE /orders/99 |
| POST /updateProduct/5 | PUT /products/5 |
Вложенные ресурсы строятся иерархически. Логика та же, что в файловой системе:
- /users — все пользователи
- /users/42 — конкретный пользователь
- /users/42/orders — заказы конкретного пользователя
- /users/42/orders/99 — конкретный заказ конкретного пользователя
HTTP-методы в REST: GET, POST, PUT, PATCH, DELETE
Каждый REST метод имеет строго определенную семантику. Выбирать метод нужно исходя из того, что именно происходит с ресурсом, а не из удобства.
Отдельная характеристика методов — идемпотентность*. Идемпотентный метод при повторном вызове с теми же параметрами дает тот же результат. Это критично для надежности: если запрос потерялся в сети, клиент может безопасно повторить его.
Таблица: Сравнение HTTP-методов в REST
| Метод | Действие | Есть тело? | Идемпотентен? | Пример |
|---|---|---|---|---|
| GET | Получить ресурс | ❌ | ✅ | GET /products/42 |
| POST | Создать ресурс | ✅ | ❌ | POST /orders |
| PUT | Полностью заменить ресурс | ✅ | ✅ | PUT /users/42 |
| PATCH | Частично обновить ресурс | ✅ | ❌* | PATCH /users/42 |
| DELETE | Удалить ресурс | ❌ | ✅ | DELETE /orders/99 |
*PATCH технически может быть идемпотентным, но это зависит от реализации.
Важное разграничение PUT vs PATCH. PUT заменяет ресурс целиком: если вы не передали какое-то поле — оно обнулится. PATCH обновляет только те поля, которые вы передали. Для редактирования профиля пользователя (изменить только email, не трогая имя и телефон) правильно использовать PATCH.
Коды HTTP-ответов
Сервер всегда отвечает трехзначным кодом статуса. Коды сгруппированы по классам— первая цифра говорит о категории.
| Класс | Диапазон | Что означает |
|---|---|---|
| 2xx | 200–299 | Успех |
| 3xx | 300–399 | Перенаправление |
| 4xx | 400–499 | Ошибка на стороне клиента |
| 5xx | 500–599 | Ошибка на стороне сервера |
Наиболее часто встречающиеся в работе с REST API:
- 200 OK — запрос выполнен, данные в теле ответа. Стандартный ответ на GET и PUT.
- 201 Created — ресурс создан. Возвращается на POST. В заголовке Location обычно указан адрес нового ресурса.
- 204 No Content — запрос выполнен, но тело ответа пустое. Типичный ответ на DELETE.
- 400 Bad Request — сервер не понял запрос. Чаще всего — ошибка в теле или параметрах запроса.
- 401 Unauthorized — нет или неверный токен авторизации. Нужно авторизоваться.
- 403 Forbidden — авторизация есть, но прав недостаточно. Например, попытка удалить чужой заказ.
- 404 Not Found — ресурс по указанному URI не найден.
- 429 Too Many Requests — превышен лимит запросов (rate limit). Актуально при работе с публичными API.
- 500 Internal Server Error — что-то сломалось на стороне сервера. Проблема не в запросе.
Заголовки запроса и ответа в REST
Заголовки — это метаданные, которые сопровождают каждый рест запрос и ответ. Они не видны конечному пользователю, но критичны для правильной работы системы.
Ключевые заголовки запроса:
- Content-Type — формат данных в теле запроса. Например: application/json. Сервер знает, как парсить тело.
- Accept — формат данных, который клиент ожидает в ответе. Например: application/json. Если сервер умеет отдавать XML и JSON — он выберет нужный.
- Authorization — токен авторизации. Чаще всего: Authorization: Bearer <token>. Так работают API Яндекса, VK, Т-Банка.
- Cache-Control — директивы кэширования для прокси и браузера.
Главные заголовки ответа:
- Content-Type — формат данных в теле ответа. Должен совпадать с тем, что запрашивал клиент через Accept.
- Location — URI созданного ресурса (в ответе 201 Created).
- X-RateLimit-Remaining — сколько запросов осталось до достижения лимита (не стандартный, но распространенный заголовок).
Именно эта связка — метод, URI, заголовки, тело, код ответа — и составляет полную анатомию любого рест запроса. Зная ее, можно читать документацию любого API и понимать, что происходит под капотом.
REST формат данных: JSON, XML и другие варианты
REST сам по себе не навязывает конкретный формат данных. Это одно из его преимуществ перед SOAP, который прочно привязан к XML. В теории REST-сервис может отдавать данные в любом формате — главное, чтобы клиент и сервер договорились об этом через заголовки Content-Type и Accept.
На практике выбор давно сделан за вас: подавляющее большинство современных REST API работает с JSON. Но понимать, почему так вышло и когда уместны альтернативы, — важно.
JSON как основной формат REST
JSON (JavaScript Object Notation) — текстовый формат обмена данными. Несмотря на название, он давно вышел за пределы JavaScript и стал универсальным языком для передачи структурированных данных между любыми системами.
Структура JSON строится на двух конструкциях:
- Объект — набор пар «ключ: значение» в фигурных скобках {}
- Массив — упорядоченный список значений в квадратных скобках []
Поддерживаемые типы данных: строка (string), число (number), булево (true/false), null, объект и массив.
Почему используют JSON:
- Компактен. Тот же объем данных в JSON занимает в среднем на 30–40% меньше места, чем в XML — нет открывающих и закрывающих тегов.
- Легко читается. Разработчик видит структуру данных без подготовки.
- Нативно парсится в JavaScript. Один вызов JSON.parse() — и данные в памяти браузера как обычный объект.
- Поддерживается везде. Любой современный язык — Python, Go, Java, Kotlin, Swift — имеет встроенные инструменты для работы с JSON.
XML в REST: когда еще используется
XML (eXtensible Markup Language) — текстовый формат с иерархической структурой на основе тегов. Именно XML был стандартом обмена данными в корпоративном мире до широкого распространения JSON.
Объем сообщения больше, читается тяжелее — но у XML есть сильные стороны, из-за которых он никуда не исчез.
Когда XML все еще уместен:
- Интеграция с государственными системами. ФНС, Росстат, ФСС — значительная часть российских регуляторных API работает с XML-форматами, потому что стандарты принимались в эпоху XML.
- Корпоративные системы и 1С. Платформа 1С исторически ориентирована на XML. Интеграция 1С с внешними сервисами через REST нередко предполагает именно XML в теле запроса.
- SOAP-совместимость. Если REST-сервис работает рядом с SOAP-системой и обменивается с ней данными, XML становится общим знаменателем.
- Сложные документные структуры. XML поддерживает атрибуты, пространства имен и схемы валидации (XSD) — это полезно для юридически значимых документов.
Другие форматы: когда JSON и XML недостаточно
REST не ограничивается двумя форматами. В зависимости от задачи применяются и другие.
multipart/form-data — стандартный способ передать файл через REST запрос. Когда пользователь загружает фото в соцсеть или прикрепляет документ в сервисе банка — скорее всего, используется именно этот формат. Файл передается в теле запроса вместе с метаданными.
text/plain — простой текст без структуры. Используется редко: для webhook-уведомлений или простых служебных ответов.
application/x-www-form-urlencoded — формат HTML-форм. Данные передаются как строка параметров: name=Ivan&age=30. Иногда встречается в OAuth-потоках авторизации.
Бинарные форматы (Protocol Buffers, MessagePack). Технически REST может работать и с бинарными форматами — они компактнее JSON и быстрее парсятся. Но в этом случае теряется одно из главных достоинств REST: человекочитаемость. Для бинарных форматов обычно выбирают gRPC, а не REST.
Как клиент и сервер договариваются о формате
Выбор формата — это не решение сервера в одностороннем порядке. Это переговоры через заголовки HTTP. Механизм называется content negotiation.
| Заголовок | Кто ставит | Смысл |
|---|---|---|
| Content-Type: application/json | Клиент в запросе | «Я отправляю данные в JSON» |
| Accept: application/json | Клиент в запросе | «Хочу получить ответ в JSON» |
| Content-Type: application/json | Сервер в ответе | «Я отвечаю в JSON» |
| Content-Type: application/xml | Сервер в ответе | «Я отвечаю в XML» |
Если сервер не поддерживает запрошенный клиентом формат, он должен вернуть код 406 Not Acceptable. Хорошо спроектированное REST приложение всегда явно указывает Content-Type в обе стороны — это часть принципа самоописывающих сообщений из Uniform Interface.
Рест апи простыми словами: объясняем на понятных примерах
Предыдущие разделы были про устройство REST изнутри. Этот — для тех, кто хочет понять суть без погружения в технические детали.
Аналогия с официантом в ресторане
Самое распространенное объяснение REST API — через ресторан. И оно работает, потому что отражает реальную структуру взаимодействия.
Представьте ресторан:
- Вы (гость) — это клиент, например мобильное приложение или браузер.
- Кухня — это сервер: здесь хранятся все данные и выполняется бизнес-логика.
- Официант — это REST API: посредник, который принимает ваш заказ, передает его на кухню и приносит результат.
Вы не заходите на кухню сами. Вы не знаете, как устроены плиты и где хранятся продукты. Вы просто делаете заказ через официанта по установленному меню — и получаете блюдо.
![]()
Важно: официант не запоминает, что вы заказывали в прошлый раз. Каждый раз, когда вы зовете его снова, нужно повторить заказ с нуля. Это и есть stateless — сервер не помнит предыдущих рест запросов.
Как мобильное приложение общается с сервером
Возьмем реальный сценарий: вы открываете приложение интернет-магазина и листаете ленту товаров. Что происходит в этот момент?
Шаг 1. Приложение на вашем телефоне — это клиент. Оно отправляет GET-запрос на сервер приложения.
Шаг 2. Запрос уходит по HTTPS через интернет на серверы интернет-магазина. По дороге он проходит через CDN и балансировщик нагрузки — но приложение об этом не знает.
Шаг 3. Сервер обрабатывает запрос: идет в базу данных, забирает 20 товаров из категории «обувь», формирует JSON-ответ.
Шаг 4. Сервер возвращает ответ, что нашел 840 беговых кроссовок белого цвета.
Шаг 5. Приложение получает JSON, разбирает его и отображает карточки товаров на экране.
Весь этот цикл занимает в среднем 100–300 миллисекунд. Вы видите товары — и не подозреваете, что только что в фоне прошло несколько рест запросов.
Чем REST отличается от обычного сайта
Когда вы открываете обычный сайт в браузере — например, статью на Хабре — сервер возвращает готовый HTML: текст, разметку, стили. Браузер отображает страницу как есть. Вы не можете взять этот HTML и использовать в своем приложении — он заточен под визуальное отображение.
Когда вы обращаетесь к REST API — сервер возвращает чистые данные в JSON. Никакой верстки, никаких стилей. Только данные. Дальше каждый клиент делает с ними что хочет: мобильное приложение покажет их в своем интерфейсе, другой сервис сохранит в базу, скрипт аналитики передаст в дашборд.
Таблица: Сравнение обычного сайта с REST API
| Обычный сайт | REST API | |
|---|---|---|
| Что возвращает сервер | HTML-страница | JSON с данными |
| Кто это использует | Только браузер | Любой клиент |
| Можно ли переиспользовать | Нет | Да |
| Зависит от интерфейса | Да | Нет |
| Пример | Страница товара на сайте | Карточка товара в приложении |
Именно поэтому крупные сервисы строят один REST API и используют его сразу везде: на сайте, в iOS-приложении, в Android-приложении, в партнерских интеграциях.
Три сценария, где REST работает прямо сейчас
Чтобы окончательно закрепить понимание — три конкретных ситуации из повседневной жизни.
Оплата картой на маркетплейсе. Вы нажимаете «Оплатить» на Wildberries — сайт отправляет POST-запрос к REST API платежного шлюза (например, T-Pay). Шлюз проверяет данные карты, списывает деньги и возвращает JSON с результатом: {"status": "success", "transaction_id": "TXN-88291"}. Все это — за секунды.
Авторизация через VK ID. Вы нажимаете «Войти через VK» на стороннем сайте. Сайт обращается к REST API VK ID, получает токен пользователя и с его помощью запрашивает имя и фото. Пользователь видит: «Добро пожаловать, Иван».
Проверка остатков на складе. Продавец на Ozon использует Seller API: его учетная система автоматически каждые 15 минут отправляет GET-запрос к POST /v3/product/info/stocks и синхронизирует остатки. Никакого ручного труда — только рест запросы по расписанию.
Во всех трех случаях REST — это невидимая инфраструктура, которая делает взаимодействие между системами возможным. Именно поэтому REST это архитектурный стиль, а не просто техническая деталь: он определяет, как устроен современный цифровой мир.
Правила REST: что делает API по-настоящему RESTful
Между принципами REST есть разрыв, и именно здесь большинство API перестают быть RESTful и превращаются в «REST-подобные». Этот раздел — о правилах, которые отличают хорошо спроектированное REST приложение от того, что просто использует HTTP.
Правила именования ресурсов и эндпоинтов
URL в REST — это адрес ресурса, а не описание действия. Это кажется очевидным, но на практике нарушается постоянно.
Правило 1: существительные, не глаголы.
Метод HTTP уже говорит, что делать. URL должен говорить, с чем. Сравните:
| ❌ Плохо | ✅ Хорошо | Почему |
|---|---|---|
| POST /createOrder | POST /orders | Глагол лишний — он уже в методе POST |
| GET /getUserList | GET /users | То же самое |
| DELETE /deleteProduct/5 | DELETE /products/5 | DELETE все скажет сам |
| POST /updateUserStatus | PATCH /users/42 | Частичное обновление — PATCH |
Правило 2: множественное число для коллекций.
/users — коллекция, /users/42 — конкретный элемент. Это соглашение, принятое в большинстве публичных API: Ozon Seller API, VK API, Яндекс Cloud API используют именно множественное число.
Правило 3: строчные буквы и дефисы, не camelCase.
URL нечувствителен к регистру, но convention — нижний регистр с дефисом: /delivery-orders, а не /deliveryOrders и не /Delivery_Orders.
Правило 4: иерархия через слэши, не через параметры.
Вложенные ресурсы строятся через путь:
/users/42/orders — все заказы пользователя 42
/users/42/orders/99 — конкретный заказ пользователя 42
/users/42/orders/99/items — позиции этого заказа
Глубже трех уровней вложенности идти не стоит — URL становится нечитаемым. Если логика сложнее, лучше использовать параметры запроса.
Версионирование REST API
Любой сервис меняется. Добавляются поля, удаляются старые, меняется логика. Если клиенты завязаны на конкретную версию API — изменения сломают их. Именно для этого существует версионирование.
Три основных подхода:
- Версия в URL (самый распространенный)
https://api.example.ru/v1/orders
https://api.example.ru/v2/orders
Плюс: очевидно, легко тестировать, просто объяснить. Минус: «грязит» URL, версия — не часть ресурса.
- Версия в заголовке
GET /orders HTTP/1.1
Accept: application/vnd.example.v2+json
Плюс: URL остается чистым, это «идеологически правильнее» с точки зрения REST. Минус: сложнее тестировать, неочевидно для новичков. Используют GitHub API.
- Версия в параметре запроса
GET /orders?version=2
Самый редкий подход. Удобен для быстрого тестирования, но не рекомендован для production.
На практике версия в URL выигрывает по простоте и читаемости. Правила REST не предписывают конкретный способ — выбор за командой.
Авторизация и безопасность в REST
Поскольку REST stateless, авторизация не может жить в сессии на сервере. Клиент обязан передавать токен в каждом рест запросе.
Bearer-токен* — самый распространенный способ. Клиент получает токен при авторизации и передает его в заголовке:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
OAuth 2.0 — стандарт делегированной авторизации. Позволяет выдавать ограниченный доступ третьим сервисам без передачи логина и пароля. Именно OAuth стоит за кнопкой «Войти через VK» или «Войти через Яндекс».
Схема упрощенно:
Пользователь → нажимает «Войти через VK»
Сайт → перенаправляет на страницу VK
VK → пользователь разрешает доступ
VK → возвращает сайту токен доступа
Сайт → использует токен для GET /users/me к VK API
Три обязательных правила безопасности REST API:
- HTTPS всегда. Никакого HTTP в production. Данные передаются в открытом виде — токены, персональные данные окажутся доступны любому, кто слушает трафик.
- Минимум прав (least privilege). Токен должен давать доступ только к тому, что нужно. Токен для чтения каталога не должен позволять удалять заказы.
- Короткий TTL токена. Access-токен живет 15–60 минут, после чего обновляется через refresh-токен. Если токен утек — ущерб ограничен во времени.
Обработка ошибок: как правильно возвращать проблемы
Хорошая обработка ошибок — признак зрелого API. Плохая практика — всегда возвращать код 200 OK и прятать ошибку в теле ответа. Это ломает все инструменты мониторинга и мешает клиенту корректно реагировать.
Правильный подход: HTTP-код отражает реальный статус, тело содержит структурированное описание ошибки.
Пагинация, фильтрация и сортировка
Когда ресурс — это коллекция из тысяч объектов, отдавать ее целиком нельзя. Это сломает сервер и клиент. Для управления выборкой используются параметры строки запроса (query string).
Пагинация — разбивка на страницы:
GET /products?page=3&limit=20
GET /orders?offset=40&limit=20
Фильтрация — отбор по условию:
GET /products?category=shoes&brand=nike&min_price=3000
Сортировка — порядок вывода:
GET /products?sort=price&order=asc
GET /orders?sort=created_at&order=desc
Правила REST не регламентируют конкретные имена параметров — page, offset, cursor — главное, чтобы они были задокументированы и консистентны по всему API.
REST приложение: примеры и сценарии использования
Мобильное приложение — самый массовый клиент REST API. Каждое iOS или Android-приложение, которое работает с интернетом, почти наверняка использует REST подход для общения с сервером.
Когда вы открываете приложение банка и видите баланс счета — приложение в этот момент отправляет GET-запрос к банк API с вашим токеном авторизации. Сервер возвращает JSON с суммой, датой последней операции и списком транзакций. Приложение разбирает JSON и рисует цифры на экране.
Когда вы делаете перевод — приложение отправляет POST-запрос с телом, в котором указаны получатель и сумма. Сервер списывает деньги, создает транзакцию и возвращает 201 Created с идентификатором операции.
Главное свойство такой архитектуры: один REST API обслуживает сразу несколько клиентов — iOS-приложение, Android-приложение, веб-версию в браузере и партнерские интеграции. Это принцип REST стиля в действии: сервер отдает данные, а каждый клиент сам решает, как их отобразить.
REST в интеграции бизнес-систем
REST — стандарт де-факто для B2B-интеграций. Когда одна корпоративная система должна обмениваться данными с другой, REST запрос — это чаще всего первое, что рассматривают.
Несколько конкретных российских сценариев.
Продавец на Яндекс Маркете и его учетная система. Яндекс Маркет API работает на HTTP-протоколе и следует принципам REST. Продавец подключает свою ERP или МойСклад к Яндекс Маркету через API: остатки товаров обновляются автоматически, новые заказы падают в систему без ручного ввода, статусы отгрузок синхронизируются в реальном времени. Все это — рест запросы по расписанию и по событиям.
Интернет-магазин и платежный шлюз. Когда покупатель нажимает «Оплатить» на любом российском сайте — магазин отправляет POST-запрос к REST API платежного сервиса. Шлюз инициирует платеж, возвращает URL для редиректа или статус операции в JSON. Без REST здесь не обходится ни одна транзакция.
CRM и внешние сервисы. AmoCRM, Битрикс24 и другие российские CRM публикуют REST API, через которые к ним подключаются мессенджеры, колл-центры, системы аналитики. Новая заявка с сайта → POST-запрос → сделка в CRM → автоматическое уведомление менеджеру.
REST и микросервисная архитектура
Микросервисы — это архитектурный подход, при котором большое приложение разбивается на множество небольших независимых сервисов. Каждый сервис отвечает за свою задачу и общается с остальными через API.
REST — один из главных протоколов rest-взаимодействия внутри микросервисной архитектуры. Сервис заказов отправляет рест запрос к сервису платежей. Сервис уведомлений запрашивает у сервиса пользователей email для письма. Каждый сервис — и клиент, и сервер одновременно.
Преимущества REST в микросервисах:
- Технологическая независимость. Сервис на Python спокойно общается с сервисом на Go через REST — язык реализации не имеет значения.
- Независимое масштабирование. Если на сервис товарного каталога нагрузка выросла — масштабируем только его, не трогая остальные.
- Простота отладки. REST запрос можно воспроизвести вручную через любой инструмент и посмотреть ответ.
Инструменты для работы с REST запросами
Прежде чем писать код, разработчики исследуют API «руками». Для этого существуют специальные инструменты. Вот четыре основных.
Postman — самый популярный инструмент для работы с REST API. Графический интерфейс, коллекции запросов, автоматические тесты, генерация кода на разных языках. Postman используют 69% разработчиков, которые тратят на API более 10 часов в неделю. Бесплатный для индивидуальных разработчиков.
Insomnia — open-source альтернатива Postman. Легче, без обязательной регистрации, поддерживает GraphQL и gRPC помимо REST. Популярна среди тех, кто не хочет привязываться к облачному аккаунту.
curl — утилита командной строки. Есть на каждом Linux/macOS, доступна на Windows. Позволяет отправить рест запрос в одну строку прямо из терминала.
Swagger UI / OpenAPI — интерактивная документация прямо в браузере. Разработчик описывает API в формате OpenAPI (YAML или JSON), и Swagger UI автоматически генерирует страницу, на которой можно читать описание методов и отправлять тестовые запросы без дополнительных инструментов.
Таблица: Сравнение инструментов для работы с REST запросами
| Инструмент | Тип | Для кого |
|---|---|---|
| Postman | Десктоп + облако | Разработчики, тестировщики |
| Insomnia | Десктоп, open-source | Разработчики |
| curl | Командная строка | Разработчики, DevOps |
| Swagger UI | Браузер | Все — от разработчика до аналитика |
Протоколы REST и альтернативы: когда REST — не лучший выбор
REST и HTTP: как они связаны
![]()
Важно зафиксировать: REST — это не протокол. Это архитектурный стиль, который описывает, как организовать систему. HTTP — это протокол, транспортный слой, по которому идут рест запросы.
Их отношения можно описать так: HTTP — это дорога, REST — правила дорожного движения на ней. Можно ехать по той же дороге и нарушать все правила (нарушать принципы REST архитектуры) — дорога никуда не денется.
REST ничего не говорит о том, как именно передавать сообщения, какой должна быть структура URL или в каком формате данные. Все это — решения разработчика. HTTP просто предоставляет инструменты: методы, заголовки, коды ответа, кэширование. REST говорит, как этими инструментами правильно пользоваться.
Именно поэтому фраза «протоколы REST» технически некорректна — REST не является протоколом. Корректно говорить: «REST поверх HTTP» или «HTTP-протокол как транспорт для REST-сервисов».
REST против SOAP: в чем принципиальная разница
SOAP (Simple Object Access Protocol) — старший брат REST. Он появился раньше и долгое время был стандартом корпоративных веб-сервисов. Ключевое отличие — SOAP это протокол, со строгими правилами формата сообщений, обязательным XML и собственным стандартом безопасности (WS-Security).
Таблица: Критерии сравнения REST и SOAP
| Критерий | REST | SOAP |
|---|---|---|
| Тип | Архитектурный стиль | Протокол |
| Формат данных | JSON, XML, любой | Только XML |
| Транспорт | HTTP/HTTPS | HTTP, SMTP, TCP и другие |
| Сложность | Низкая | Высокая |
| Скорость | Выше | Ниже (из-за XML и конвертации) |
| Стандарт безопасности | HTTPS + OAuth | WS-Security |
| Стандарт описания | OpenAPI/Swagger | WSDL |
| Где используется | Публичные API, мобильные приложения | Банки, госсистемы, 1С |
SOAP еще актуален — он живет там, где требуются строгие гарантии транзакционности и формальные контракты. Госуслуги до сих пор используют SOAP для некоторых видов межведомственного взаимодействия (СМЭВ). Часть банковских систем, интеграции с 1С, старые корпоративные ERP — все это SOAP-территория.
Но для нового публичного API в #CURRENT_YEAR# году выбирать SOAP нет оснований — REST проще, быстрее и понятнее любому разработчику.
REST против GraphQL: когда GraphQL выигрывает
GraphQL — язык запросов к API, разработанный в 2012 году и открытый в 2015-м. Он решает две конкретные проблемы REST, которые особенно болезненны при работе с мобильными клиентами.
Overfetching — получение лишних данных. REST-эндпоинт /users/42 вернет все поля пользователя: имя, email, телефон, адрес, дату регистрации, аватар. Если клиенту нужно только имя — он все равно получит весь объект и отбросит 90% данных.
Underfetching — нехватка данных в одном запросе. Чтобы отобразить карточку заказа с именем пользователя и названием товара, REST-клиенту нужно сделать три запроса: /orders/99, /users/42, /products/1234. GraphQL позволяет получить все это в одном запросе — клиент сам описывает, какие поля ему нужны.
Когда GraphQL имеет смысл:
- Мобильное приложение с ограниченным трафиком, где важно минимизировать объем передаваемых данных.
- Клиентов много и они разные: iOS, Android, веб — каждый хочет свой набор полей.
- Данные глубоко вложены и связаны — например, лента с постами, комментариями, лайками, аватарами авторов.
Яндекс Погода, например, перешла с REST на GraphQL именно потому, что разные клиенты запрашивали разные наборы полей прогноза — и содержать отдельные REST-эндпоинты для каждого стало нецелесообразно.
Когда REST достаточно:
- Простой CRUD-сервис* с предсказуемой структурой данных.
- Публичный API для внешних разработчиков — REST проще документировать и тестировать.
- Команда небольшая и ресурсов на поддержку GraphQL-схемы нет.
REST против gRPC: производительность против простоты
gRPC — фреймворк удаленного вызова процедур от Google, работающий поверх HTTP/2. Вместо текстового JSON использует бинарный формат Protocol Buffers (protobuf). Это дает значительный прирост скорости: gRPC примерно в 7 раз быстрее REST при получении данных и в 10 раз при отправке для сопоставимых нагрузок.
Таблица: Критерии сравнения REST и gRPC
| Критерий | REST | gRPC |
|---|---|---|
| Протокол | HTTP/1.1 | HTTP/2 |
| Формат данных | JSON (текст) | Protocol Buffers (бинарный) |
| Читаемость | Высокая | Низкая (бинарник) |
| Производительность | Средняя | Высокая |
| Поддержка браузером | Полная | Ограниченная |
| Документация | OpenAPI/Swagger | Proto-файлы |
| Где уместен | Публичные API, веб | Внутренние микросервисы |
gRPC хорошо работает внутри инфраструктуры — между микросервисами, которые обмениваются данными тысячи раз в секунду и где миллисекунды имеют значение. Именно поэтому Google, Яндекс и другие высоконагруженные системы используют gRPC для внутренних коммуникаций.
Но gRPC плохо подходит для публичного API: браузеры не умеют работать с ним напрямую, отлаживать бинарный трафик сложнее, а порог входа для сторонних разработчиков выше.
Таблица: Сравнение протоколов и выбор под задачу
| Задача | Лучший выбор | Почему |
|---|---|---|
| Публичный API для разработчиков | REST | Простота, экосистема, документация |
| Мобильное приложение с гибкими запросами | GraphQL | Нет overfetching, один запрос вместо нескольких |
| Внутренние микросервисы с высокой нагрузкой | gRPC | Скорость, бинарный формат, HTTP/2 |
| Корпоративные системы, банки, госсектор | SOAP | Транзакционность, WS-Security, совместимость |
| Уведомления в реальном времени | WebSocket | Двусторонний канал, не REST-модель |
REST остается правильным выбором по умолчанию для большинства задач. Альтернативы стоит рассматривать тогда, когда REST упирается в конкретное ограничение — а не потому что «так модно» или «GraphQL звучит интереснее».
Типичные ошибки при проектировании REST API, которые встречаются в продакшне:
- Глаголы в URL вместо существительных: /getOrders, /createUser, /deleteProduct. Метод HTTP уже несет смысл действия — дублировать его в URI не нужно.
- Возврат 200 OK при ошибке с описанием проблемы в теле. Это ломает мониторинг, алертинг и логику клиента. Используйте правильные HTTP-коды.
- Игнорирование версионирования на старте. Когда API уже используют клиенты, ломающие изменения без версии /v2/ — это катастрофа.
- Отсутствие пагинации на коллекциях. Эндпоинт, который возвращает все 50 000 товаров без ограничений, — это не баг клиента, это ошибка проектирования.
- HTTP вместо HTTPS. В #CURRENT_YEAR# году это не обсуждается: любой REST API, работающий без шифрования, небезопасен по определению.
FAQ — Часто задаваемые вопросы о REST
REST — это протокол или технология?
Ни то ни другое. REST — это архитектурный стиль: набор ограничений и принципов для проектирования распределенных систем. Его сформулировал Рой Филдинг в диссертации 2000 года. Протокол — это HTTP, по которому идут рест запросы. Технология — это конкретный фреймворк (Flask, Spring, Express), с помощью которого REST реализуется. Сам по себе REST не требует установки и не является библиотекой.
Чем REST отличается от RESTful?
REST — концепция, описанная Филдингом. RESTful — определение конкретного API, которое строго следует всем шести принципам REST архитектуры. На практике большинство современных API называют себя REST, но полностью RESTful не являются — особенно в части HATEOAS. Это нормально: главное, что они следуют духу REST подхода, а не букве.
Что такое REST запрос и чем он отличается от обычного HTTP-запроса?
Технически — ничем. REST запрос это обычный HTTP-запрос. Разница — в том, как он построен: соблюдает ли он принципы REST (stateless, единообразие интерфейса, правильное использование методов и кодов ответа). HTTP-запрос к эндпоинту /getUser?id=42 методом GET технически работает, но не соответствует правилам REST — URL содержит глагол вместо существительного. Правильный рест запрос: GET /users/42.
Обязательно ли использовать JSON в REST?
Нет. REST не привязан к конкретному формату данных — это одно из его преимуществ перед SOAP. Сервер может отдавать XML, YAML, plain text, multipart-файлы. Формат согласуется через заголовки Content-Type и Accept. JSON стал стандартом де-факто потому, что он компактен, легко читается и нативно поддерживается в JavaScript — а не потому что REST это предписывает.
Может ли REST работать без HTTP?
Теоретически — да. Принципы REST архитектуры не привязаны к конкретному транспортному протоколу. Но на практике 99,9% REST-сервисов работают поверх HTTP или HTTPS, потому что HTTP уже предоставляет все необходимое: методы, заголовки, статусные коды, кэширование. Реализовывать REST поверх чего-то другого — экзотика без практического смысла.
Как REST используется в мобильных приложениях?
Мобильное приложение выступает клиентом: оно формирует рест запросы, отправляет их на сервер и получает JSON-ответы. Сервер возвращает чистые данные без разметки — приложение само решает, как их отобразить. Это позволяет использовать один и тот же REST API одновременно в iOS-приложении, Android-приложении и веб-версии сервиса.
Мнение эксперта
— Александр Апраксин, совладелец и генеральный директор digital-агентства MWI (входит в ТОП-10 Рейтинга Рунета). Автор книги «50 способов увеличения продаж интернет-магазина». Ведущий подкаста «Маркетологи», автор Telegram-канала Апраксин Pro Бизнес. Практик с 15+ годами опыта в digital и eCommerce. Сайт компании: mwi.me.
«REST часто воспринимают как синоним “делать API через HTTP”. Это заблуждение порождает целый класс проблем: глаголы в URL, игнорирование кодов ответа, stateful-поведение там, где его быть не должно. Люди называют свой сервис REST просто потому, что он принимает HTTP-запросы — и считают, что этого достаточно.
На самом деле REST это архитектурный стиль — набор ограничений, каждое из которых решает конкретную инженерную проблему. Stateless дает масштабируемость. Uniform Interface дает предсказуемость. Кэшируемость дает производительность. Когда разработчик понимает, зачем каждый принцип существует — он начинает проектировать API осознанно, а не по наитию.
Мой совет: прежде чем написать первый эндпоинт, потратьте час на оригинальную диссертацию Филдинга или хотя бы на ее пятую главу. Это сэкономит недели рефакторинга потом».
Заключение
REST — это язык, на котором разговаривают современные цифровые системы: мобильные приложения с серверами, сервисы между собой, бизнесы с партнерами.
Расшифровка REST — Representational State Transfer — в трех словах описывает суть: клиент запрашивает у сервера представление ресурса и получает его в ответ. Поверх этой простой идеи Рой Филдинг выстроил шесть принципов, которые сделали веб таким, каким мы его знаем сегодня.
Понимание основ REST открывает практический горизонт: вы можете читать документацию любого публичного API и понимать, что происходит под капотом. Вы можете осознанно проектировать собственные сервисы, выбирать между REST, GraphQL и gRPC исходя из задачи, а не моды. Вы можете говорить с разработчиками на одном языке.
Если после прочтения статьи вы поняли, что ваш текущий API нарушает половину принципов REST — так бывает.
Оставьте заявку на консультацию: разберем архитектуру вашего сервиса и покажем, что стоит исправить в первую очередь.Термины и сноски
* API — Application Programming Interface — интерфейс, через который программы взаимодействуют друг с другом
* Bearer-токен — Тип токена авторизации, передается в заголовке Authorization: Bearer <token>
* CRUD — Create, Read, Update, Delete — четыре базовые операции с данными, которым соответствуют методы POST, GET, PUT/PATCH, DELETE
* HATEOAS — Hypermedia As The Engine Of Application State — принцип, при котором сервер возвращает в ответе ссылки на возможные следующие действия
* HTTP— HyperText Transfer Protocol — транспортный протокол, поверх которого работает REST
* Идемпотентность — Свойство метода: повторный вызов с теми же параметрами дает тот же результат. GET, PUT, DELETE — идемпотентны. POST — нет