Открыть сервис

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:

  1. Клиент-серверная архитектура (Client-Server). Интерфейс пользователя (клиент) отделён от хранилища данных (сервер). Это повышает переносимость клиентского кода и упрощает масштабирование серверной части.
  2. Отсутствие состояния (Stateless). Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для его обработки. Сервер не хранит никаких данных о состоянии клиента между запросами. Сессионные данные (например, аутентификация) передаются в каждом запросе. Это упрощает сервер и повышает его надёжность.
  3. Кэширование (Cacheable). Ответы сервера должны явно или неявно указывать, можно ли их кэшировать. Если клиент или промежуточный прокси-сервер кэширует ответ, это позволяет избежать повторных запросов и снижает нагрузку на сервер.
  4. Единообразие интерфейса (Uniform Interface). Это ключевое ограничение, которое отличает REST от других архитектур. Оно включает четыре подпринципа:
  • Идентификация ресурсов: Каждый ресурс (данные, объект, файл) идентифицируется уникальным URI (например, /users/42).
  • Манипуляция ресурсами через представления: Клиент получает не сам ресурс, а его представление (обычно в формате JSON или XML). Это представление содержит достаточно информации для изменения или удаления ресурса.
  • Самодостаточные сообщения (Self-descriptive messages): Каждое сообщение (запрос или ответ) содержит всю информацию, необходимую для его обработки. Например, в заголовках HTTP указывается тип содержимого (Content-Type) и допустимые методы (Allow).
  • HATEOAS (Hypermedia as the Engine of Application State): Клиент должен переходить по состояниям приложения исключительно через гипермедиа-ссылки, которые предоставляет сервер в ответах. На практике этот принцип часто не реализуется полностью, особенно в простых API.
  1. Многоуровневая система (Layered System). Архитектура может состоять из нескольких уровней (например, балансировщики нагрузки, прокси-серверы, кэши). Клиент обычно не знает, взаимодействует ли он напрямую с конечным сервером или с промежуточным узлом.
  2. Код по требованию (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 зависит от конкретных требований проекта: сложности данных, производительности, необходимости строгой типизации и опыта команды.

Источники

  1. Fielding, R. T. (2000). Architectural Styles and the Design of Network-based Software Architectures (Doctoral dissertation). University of California, Irvine.
  2. Fielding, R. T., & Taylor, R. N. (2002). Principled design of the modern Web architecture. ACM Transactions on Internet Technology (TOIT), 2(2), 115-150.
  3. Richardson, L., & Ruby, S. (2007). RESTful Web Services. O'Reilly Media.
  4. Fowler, M. (2010). Richardson Maturity Model. martinfowler.com.
  5. Masse, M. (2011). REST API Design Rulebook. O'Reilly Media.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →