REST API
REST API (от англ. Representational State Transfer — «передача репрезентативного состояния») — это архитектурный стиль взаимодействия компонентов распределённого приложения в сети, при котором запросы и ответы строятся на основе стандартных протоколов, в первую очередь HTTP. В отличие от протоколов или библиотек, REST является набором принципов и ограничений, которые позволяют создавать масштабируемые, надёжные и производительные веб-сервисы. Системы, соответствующие этим принципам, называются RESTful-сервисами.
История и происхождение
Концепция REST была впервые сформулирована в 2000 году в докторской диссертации Роя Филдинга (Roy Fielding), одного из создателей протокола HTTP и спецификации URI. Филдинг проанализировал архитектуру Всемирной паутины и выделил ключевые принципы, которые обеспечивают её устойчивость и масштабируемость. Он предложил использовать эти принципы для проектирования веб-сервисов, что стало альтернативой более сложным и тяжёлым подходам, таким как SOAP (Simple Object Access Protocol).
На протяжении 2000-х годов REST-подход постепенно набирал популярность благодаря своей простоте и естественной интеграции с веб-технологиями. Крупные компании, такие как Amazon, Twitter и Flickr, начали публиковать RESTful API для своих сервисов, что способствовало стандартизации и распространению подхода. К середине 2010-х годов REST стал доминирующим стилем для создания публичных и внутренних API, вытеснив SOAP во многих областях.
Основные принципы REST
Рой Филдинг определил шесть архитектурных ограничений (constraints), которым должна соответствовать система, чтобы считаться RESTful:
- Клиент-серверная архитектура (Client-Server). Интерфейс пользователя (клиент) отделён от хранилища данных (сервер). Это повышает переносимость клиентского кода и упрощает масштабирование серверной части.
- Отсутствие состояния (Stateless). Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для его обработки. Сервер не хранит никаких данных о состоянии клиента между запросами. Сессионные данные (например, аутентификация) передаются в каждом запросе. Это упрощает сервер и повышает его надёжность.
- Кэширование (Cacheable). Ответы сервера должны явно или неявно указывать, можно ли их кэшировать. Если клиент или промежуточный прокси-сервер кэширует ответ, это позволяет избежать повторных запросов и снижает нагрузку на сервер.
- Единообразие интерфейса (Uniform Interface). Это ключевое ограничение, которое отличает REST от других архитектур. Оно включает четыре подпринципа:
- Идентификация ресурсов: Каждый ресурс (данные, объект, файл) идентифицируется уникальным URI (например,
/users/42). - Манипуляция ресурсами через представления: Клиент получает не сам ресурс, а его представление (обычно в формате JSON или XML). Это представление содержит достаточно информации для изменения или удаления ресурса.
- Самодостаточные сообщения (Self-descriptive messages): Каждое сообщение (запрос или ответ) содержит всю информацию, необходимую для его обработки. Например, в заголовках HTTP указывается тип содержимого (
Content-Type) и допустимые методы (Allow). - HATEOAS (Hypermedia as the Engine of Application State): Клиент должен переходить по состояниям приложения исключительно через гипермедиа-ссылки, которые предоставляет сервер в ответах. На практике этот принцип часто не реализуется полностью, особенно в простых API.
- Многоуровневая система (Layered System). Архитектура может состоять из нескольких уровней (например, балансировщики нагрузки, прокси-серверы, кэши). Клиент обычно не знает, взаимодействует ли он напрямую с конечным сервером или с промежуточным узлом.
- Код по требованию (Code on Demand) — опционально. Сервер может временно расширять функциональность клиента, передавая ему исполняемый код (например, JavaScript-скрипты). Это единственное необязательное ограничение.
Ресурсы и методы HTTP
В RESTful API каждый ресурс (например, пользователь, статья, товар) представлен отдельным URI. Операции над ресурсами выполняются с помощью стандартных методов HTTP:
| HTTP-метод | Действие | Пример (для ресурса /articles) |
|---|---|---|
| GET | Получение ресурса или списка ресурсов | GET /articles — получить все статьи; GET /articles/5 — получить статью с ID=5 |
| POST | Создание нового ресурса | POST /articles — создать новую статью (данные передаются в теле запроса) |
| PUT | Полная замена существующего ресурса | PUT /articles/5 — полностью заменить статью с ID=5 |
| PATCH | Частичное обновление ресурса | PATCH /articles/5 — обновить только заголовок статьи с ID=5 |
| DELETE | Удаление ресурса | DELETE /articles/5 — удалить статью с ID=5 |
Идемпотентность методов означает, что повторный вызов одного и того же запроса приводит к тому же состоянию сервера. GET, PUT, DELETE идемпотентны; POST — нет (каждый вызов создаёт новый ресурс). PATCH может быть как идемпотентным, так и нет, в зависимости от реализации.
Форматы данных и коды ответов
Наиболее распространённым форматом представления данных в REST API является JSON (JavaScript Object Notation). Он лёгок, читаем и хорошо поддерживается всеми языками программирования. Реже используется XML, особенно в унаследованных системах.
Коды состояния HTTP (Status Codes) в REST API несут смысловую нагрузку и информируют клиента о результате запроса:
- 2xx (Успех):
200 OK— стандартный ответ на успешный запрос (например,GET).201 Created— ресурс успешно создан (ответ наPOST).204 No Content— запрос выполнен, но тело ответа пусто (например, послеDELETE).- 3xx (Перенаправление):
301 Moved Permanently— ресурс перемещён на новый URI.- 4xx (Ошибка клиента):
400 Bad Request— некорректный запрос (например, невалидный JSON).401 Unauthorized— требуется аутентификация.403 Forbidden— доступ запрещён (даже после аутентификации).404 Not Found— ресурс не найден.405 Method Not Allowed— метод HTTP не поддерживается для данного URI.409 Conflict— конфликт состояния (например, попытка создать дубликат).422 Unprocessable Entity— запрос не может быть обработан из-за семантических ошибок (например, валидация данных).- 5xx (Ошибка сервера):
500 Internal Server Error— внутренняя ошибка сервера.503 Service Unavailable— сервер временно недоступен (например, из-за перегрузки).
Преимущества и недостатки
Преимущества
- Простота и понятность: REST API легко понять и использовать, так как он опирается на хорошо известные протоколы (HTTP, URI) и форматы (JSON).
- Масштабируемость: Отсутствие состояния и поддержка кэширования позволяют эффективно масштабировать серверную часть горизонтально (добавлением новых серверов).
- Независимость от платформы: Клиентом может быть любое приложение, способное отправлять HTTP-запросы — веб-браузер, мобильное приложение, сервер на любом языке.
- Широкая поддержка: Существует множество инструментов, библиотек и фреймворков для создания и потребления REST API (например, Postman, Swagger, Django REST Framework, Spring REST).
- Чёткое разделение ответственности: Клиент и сервер развиваются независимо, что упрощает разработку и тестирование.
Недостатки
- Отсутствие строгой спецификации: REST — это стиль, а не стандарт. Разные разработчики могут трактовать принципы по-разному, что приводит к несовместимости API.
- Избыточность данных: Клиент часто получает больше данных, чем ему нужно (over-fetching), или недополучает их (under-fetching), что требует дополнительных запросов. Для решения этой проблемы используются такие подходы, как GraphQL.
- Сложность с HATEOAS: Полная реализация принципа HATEOAS значительно усложняет разработку и редко применяется на практике, что делает API менее «обнаруживаемыми» (discoverable).
- Неэффективность для сложных запросов: Для получения связанных данных (например, пользователя и его заказов) может потребоваться несколько последовательных запросов, что увеличивает задержку.
Применение
REST API является основой для большинства современных веб-сервисов и мобильных приложений. Он используется в:
- Социальных сетях и мессенджерах: API Twitter (X), VK, Telegram.
- Облачных сервисах: API Amazon Web Services (AWS), Google Cloud, Microsoft Azure.
- Платёжных системах: API Stripe, PayPal, YooKassa.
- Геолокационных сервисах: API Яндекс.Карт, Google Maps.
- Интернете вещей (IoT): Управление умными устройствами через REST API.
- Микросервисной архитектуре: Внутренние API для взаимодействия между микросервисами.
Критика и альтернативы
Несмотря на широкое распространение, REST API подвергается критике за отсутствие строгой типизации и избыточность данных. Основными альтернативами являются:
- GraphQL (разработан Facebook): Язык запросов, который позволяет клиенту точно указать, какие данные ему нужны, решая проблему over- и under-fetching.
- gRPC (разработан Google): Высокопроизводительный фреймворк удалённого вызова процедур (RPC), использующий Protocol Buffers для сериализации данных. Часто применяется в микросервисных архитектурах, где важна скорость.
- SOAP: Более старый и строгий протокол, основанный на XML. Используется в корпоративных системах, где требуется высокая надёжность и формальная спецификация (например, в банковской сфере).
Выбор между REST, GraphQL и gRPC зависит от конкретных требований проекта: сложности данных, производительности, необходимости строгой типизации и опыта команды.
Источники
- Fielding, R. T. (2000). Architectural Styles and the Design of Network-based Software Architectures (Doctoral dissertation). University of California, Irvine.
- Fielding, R. T., & Taylor, R. N. (2002). Principled design of the modern Web architecture. ACM Transactions on Internet Technology (TOIT), 2(2), 115-150.
- Richardson, L., & Ruby, S. (2007). RESTful Web Services. O'Reilly Media.
- Fowler, M. (2010). Richardson Maturity Model. martinfowler.com.
- Masse, M. (2011). REST API Design Rulebook. O'Reilly Media.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →