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

Архитектурный стиль REST

REST (от англ. Representational State Transfer — «передача репрезентативного состояния») — это архитектурный стиль, определяющий набор принципов и ограничений для проектирования распределённых сетевых приложений, в первую очередь веб-сервисов. REST описывает, как клиенты и серверы должны обмениваться данными, чтобы система была масштабируемой, производительной, надёжной и простой в модификации. Стиль был предложен Роем Филдингом (Roy Fielding) в 2000 году в его докторской диссертации «Architectural Styles and the Design of Network-based Software Architectures» и стал основой для современной архитектуры Всемирной паутины (World Wide Web).

История и возникновение

Предпосылки к появлению REST возникли в середине 1990-х годов, когда веб-технологии (HTTP, HTML, URL) активно развивались, но отсутствовала формальная модель для построения сложных распределённых систем. Рой Филдинг, один из авторов спецификации HTTP/1.0 и HTTP/1.1, а также участник разработки протокола URI, в своей диссертации обобщил опыт проектирования веба и сформулировал набор архитектурных ограничений, которые, по его мнению, обеспечили его успех.

В 2000 году диссертация была опубликована, и термин REST вошёл в обиход. Первоначально концепция воспринималась как академическая, но с ростом популярности веб-сервисов (SOAP, XML-RPC) и их сложностью, REST стал предлагаться как более простая и лёгкая альтернатива. К середине 2000-х годов REST-сервисы (RESTful API) начали активно внедряться в коммерческих проектах, в том числе в API таких компаний, как Amazon, Google, Twitter (социальная сеть, заблокирована на территории РФ), Flickr. К концу 2000-х — началу 2010-х годов REST стал доминирующим архитектурным стилем для создания публичных и внутренних API.

Основные принципы и ограничения

REST не является протоколом или стандартом, а представляет собой набор архитектурных ограничений (constraints). Если система удовлетворяет всем этим ограничениям, она называется RESTful (REST-совместимой). Филдинг выделил шесть ключевых ограничений:

1. Клиент-серверная архитектура (Client-Server)

Система разделяется на две части: клиент (инициирует запросы) и сервер (обрабатывает запросы и предоставляет ресурсы). Это разделение упрощает разработку, позволяет независимо масштабировать и модифицировать компоненты.

2. Отсутствие состояния (Stateless)

Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для его обработки. Сервер не хранит информацию о состоянии сессии между запросами. Это повышает масштабируемость (любой сервер может обработать любой запрос) и надёжность (отказ одного сервера не влияет на другие). Состояние сессии (например, авторизация) хранится на стороне клиента и передаётся в каждом запросе (обычно в виде токена в заголовке).

3. Кэширование (Cacheability)

Ответы сервера должны явно указывать, могут ли они быть кэшированы клиентом или промежуточными узлами (прокси, CDN). Кэширование уменьшает нагрузку на сервер и снижает задержки. Для этого используются заголовки HTTP, такие как Cache-Control, Expires, ETag.

4. Единообразие интерфейса (Uniform Interface)

Это ключевое ограничение, которое отличает REST от других стилей. Оно состоит из четырёх подограничений:

  • Идентификация ресурсов (Identification of Resources). Каждый ресурс (объект, данные) идентифицируется уникальным URI (например, /users/123).
  • Манипуляция ресурсами через представления (Manipulation of Resources through Representations). Клиент взаимодействует не с самим ресурсом, а с его представлением (например, JSON, XML, HTML). Сервер может предоставлять разные представления одного и того же ресурса.
  • Самоописывающие сообщения (Self-descriptive Messages). Каждое сообщение содержит достаточно информации для того, чтобы его можно было обработать (например, тип данных в заголовке Content-Type, информация о кэшировании).
  • Гипермедиа как движок состояния приложения (HATEOAS — Hypermedia as the Engine of Application State). Клиент переходит между состояниями приложения (например, от списка пользователей к странице конкретного пользователя) исключительно через гиперссылки (link relations), которые сервер предоставляет в ответах. Это делает API самоописываемым и не требует от клиента знания заранее всех возможных URI.

5. Многоуровневая система (Layered System)

Архитектура может состоять из нескольких уровней (например, балансировщик нагрузки, сервер приложений, база данных). Клиент не знает, с каким именно компонентом он взаимодействует, и не может отличить прямое соединение от соединения через промежуточные узлы.

6. Код по требованию (Code on Demand) — опционально

Сервер может временно расширять функциональность клиента, передавая ему исполняемый код (например, JavaScript-скрипты). Это единственное опциональное ограничение.

Применение и примеры

REST широко используется для создания веб-сервисов (API), которые предоставляют доступ к данным и функциональности. Типичный пример — REST API для интернет-магазина:

  • GET /products — получить список всех товаров.
  • GET /products/42 — получить информацию о товаре с ID 42.
  • POST /products — создать новый товар (данные передаются в теле запроса).
  • PUT /products/42 — обновить товар с ID 42.
  • DELETE /products/42 — удалить товар с ID 42.

В этом примере ресурсами являются «товары», а операции над ними соответствуют стандартным HTTP-методам (GET, POST, PUT, DELETE). Данные обычно передаются в формате JSON (JavaScript Object Notation) или XML.

Критика и ограничения

Несмотря на широкое распространение, REST имеет критику и ограничения:

  • Сложность HATEOAS. На практике принцип HATEOAS часто игнорируется, так как его реализация усложняет как серверную, так и клиентскую часть. Большинство популярных REST API не являются полностью HATEOAS-совместимыми.
  • Отсутствие строгой спецификации. REST — это стиль, а не протокол, что приводит к различным интерпретациям и «REST-подобным» API, которые не соответствуют всем ограничениям.
  • Проблемы с передачей сложных запросов. Для операций, требующих сложной фильтрации, сортировки или агрегации данных, REST может быть неудобен, так как каждый запрос должен быть независимым и не иметь состояния. Это привело к появлению альтернатив, таких как GraphQL.
  • Избыточность при работе с большими объёмами данных. Клиент часто получает больше данных, чем ему нужно, так как сервер возвращает полное представление ресурса.

Альтернативы

Основными альтернативами REST являются:

  • SOAP (Simple Object Access Protocol). Протокол на основе XML, более строгий и формализованный, но более сложный и тяжёлый. Часто используется в корпоративных системах.
  • GraphQL. Язык запросов, разработанный Facebook (организация признана экстремистской и запрещена в РФ). Позволяет клиенту точно указать, какие данные ему нужны, что решает проблему избыточности данных.
  • gRPC. Высокопроизводительный фреймворк для удалённого вызова процедур (RPC), использующий Protocol Buffers для сериализации данных. Часто применяется в микросервисной архитектуре.

Интересные факты

  • Название REST (Representational State Transfer) отражает идею, что клиент передаёт серверу своё состояние, а сервер возвращает представление (representation) ресурса.
  • Рой Филдинг в своей диссертации подчёркивал, что REST — это не протокол, а архитектурный стиль, который может быть реализован на разных протоколах, хотя наиболее известная реализация — на HTTP.
  • Многие API, которые называют себя RESTful, на самом деле не соответствуют всем ограничениям, особенно HATEOAS. Такие API часто называют «REST-подобными» (REST-like).

Источники

  • 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.
  • Masse, M. (2011). REST API Design Rulebook. O'Reilly Media.

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

На главную BFOmetr →