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

RESTful веб-сервисы

RESTful веб-сервис (от англ. Representational State Transfer — «передача репрезентативного состояния») — это архитектурный стиль взаимодействия компонентов распределённого приложения в сети, основанный на протоколе HTTP и принципах, предложенных Роем Филдингом в 2000 году. В отличие от более ранних подходов, таких как SOAP, REST не является протоколом или стандартом, а представляет собой набор архитектурных ограничений (констрейнтов), которые определяют, как клиент и сервер обмениваются данными. Основная идея REST заключается в том, что каждый ресурс (например, пользователь, статья, заказ) идентифицируется уникальным URL, а операции над ним выполняются с помощью стандартных HTTP-методов: GET (чтение), POST (создание), PUT (обновление), DELETE (удаление) и PATCH (частичное обновление). Сервер не хранит состояние клиента между запросами (stateless), что упрощает масштабирование и повышает надёжность системы.

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

Термин REST был введён Роем Филдингом в его докторской диссертации «Architectural Styles and the Design of Network-based Software Architectures» (2000 год), защищённой в Калифорнийском университете в Ирвайне. Филдинг, один из главных разработчиков протокола HTTP, обобщил принципы, которые уже неявно использовались в ранних версиях Всемирной паутины (World Wide Web). До появления REST веб-сервисы строились преимущественно на основе SOAP (Simple Object Access Protocol) — протокола, использующего XML для обмена сообщениями и требующего строгой схемы (WSDL). SOAP был сложен в реализации, требовал много ресурсов и плохо масштабировался. REST, напротив, предложил лёгкий, интуитивно понятный подход, основанный на уже существующих возможностях HTTP.

В 2000-е годы REST стал доминирующим стилем для создания публичных API (Application Programming Interface) крупных интернет-компаний, таких как Amazon, Google, Twitter (социальная сеть, заблокирована на территории РФ), Facebook (принадлежит компании Meta, признанной экстремистской и запрещённой в РФ) и GitHub. В России REST активно используется в государственных информационных системах, например, в портале «Госуслуги» и Единой системе идентификации и аутентификации (ЕСИА), а также в коммерческих сервисах — от банковских приложений до онлайн-кинотеатров.

Основные принципы (констрейнты)

Рой Филдинг выделил шесть архитектурных ограничений, которым должен следовать RESTful сервис. Несоблюдение хотя бы одного из них делает систему не полностью RESTful.

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

Клиент (например, веб-браузер или мобильное приложение) отделён от сервера (хранилища данных и бизнес-логики). Это позволяет разрабатывать их независимо: клиент не заботится о хранении данных, сервер — о пользовательском интерфейсе.

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

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

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

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

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

Это ключевое ограничение, которое включает четыре подпринципа:

  • Идентификация ресурсов: каждый ресурс имеет уникальный URI (например, /users/123).
  • Манипуляция ресурсами через представления: клиент получает не сам ресурс, а его представление (например, JSON или XML), которое содержит достаточно информации для изменения ресурса.
  • Самодокументируемые сообщения: каждый запрос содержит информацию о том, как его обрабатывать (например, Content-Type, Accept).
  • HATEOAS (Hypermedia As The Engine Of Application State): ответ сервера должен содержать гиперссылки на связанные действия (например, после создания заказа — ссылка на его оплату). Это позволяет клиенту динамически навигировать по API, не зная заранее всех URL.

5. Слои (Layered System)

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

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

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

Структура запроса и ответа

RESTful сервис использует стандартные HTTP-методы, которые соответствуют операциям CRUD (Create, Read, Update, Delete):

HTTP-методОперацияПример URIДействие
GETЧтение/usersПолучить список пользователей
GETЧтение/users/123Получить пользователя с ID=123
POSTСоздание/usersСоздать нового пользователя
PUTПолное обновление/users/123Заменить все данные пользователя
PATCHЧастичное обновление/users/123Изменить только имя пользователя
DELETEУдаление/users/123Удалить пользователя

Ответ сервера обычно содержит:

  • HTTP-статус-код: 200 (OK), 201 (Created), 204 (No Content), 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found), 500 (Internal Server Error) и другие.
  • Заголовки: Content-Type (например, application/json), Cache-Control, Location (для созданных ресурсов).
  • Тело ответа: представление ресурса в формате JSON (наиболее популярен), XML, YAML или другом.

Форматы данных

Хотя REST не предписывает конкретный формат, на практике наиболее распространён JSON (JavaScript Object Notation). Пример запроса на создание пользователя:

``` POST /users HTTP/1.1 Host: example.com Content-Type: application/json

{ "name": "Иван Петров", "email": "ivan@example.com", "age": 30 } ```

Ответ сервера:

``` HTTP/1.1 201 Created Content-Type: application/json Location: /users/456

{ "id": 456, "name": "Иван Петров", "email": "ivan@example.com", "age": 30, "createdAt": "2024-01-15T10:30:00Z" } ```

XML также используется, особенно в корпоративных системах, но уступает JSON по скорости парсинга и читаемости.

RESTful API в России

В России RESTful веб-сервисы широко применяются в государственных и коммерческих проектах. Например, API портала «Госуслуги» построен на REST-принципах, что позволяет сторонним разработчикам интегрировать свои приложения с государственными услугами (запись к врачу, проверка штрафов, подача заявлений). Банковские системы, такие как Сбербанк, Тинькофф (признан иноагентом в РФ) и ВТБ, предоставляют RESTful API для разработки мобильных приложений и интернет-банкинга. Российские компании, работающие с большими данными (Яндекс, VK), также используют REST для своих внешних и внутренних сервисов.

Преимущества и недостатки

Преимущества

  • Простота: основан на стандартном HTTP, не требует сложных инструментов (например, WSDL или SOAP-движков).
  • Масштабируемость: отсутствие состояния позволяет легко добавлять серверы.
  • Гибкость: поддержка различных форматов данных (JSON, XML, YAML).
  • Кэширование: снижает нагрузку на сервер.
  • Читаемость: URI и методы интуитивно понятны.

Недостатки

  • Отсутствие строгой типизации: в отличие от SOAP, REST не имеет встроенной схемы для проверки данных (хотя это можно решить с помощью OpenAPI/Swagger).
  • Сложность с HATEOAS: на практике большинство API не реализуют гипермедиа, что делает их не полностью RESTful.
  • Проблемы с безопасностью: REST не предоставляет встроенных механизмов шифрования или аутентификации (используются HTTPS, OAuth 2.0, JWT).
  • Избыточность данных: клиент часто получает больше данных, чем нужно (решается с помощью GraphQL или частичных ответов).

Сравнение с другими подходами

ХарактеристикаRESTSOAPGraphQL
ПротоколHTTPHTTP, SMTP, JMSHTTP
Формат данныхJSON, XMLXMLJSON
СложностьНизкаяВысокаяСредняя
КэшированиеВстроенноеСложноеОграниченное
Гибкость запросовФиксированные URIФиксированные операцииЗапросы клиента
СостояниеStatelessStateless или StatefulStateless

Примеры RESTful API

  • GitHub API: позволяет управлять репозиториями, задачами, пользователями. Использует GET, POST, PATCH, DELETE.
  • API Яндекс.Погоды: предоставляет данные о погоде по координатам.
  • API «Госуслуг»: для авторизации, получения данных о гражданине, подачи заявлений.
  • API Telegram: хотя использует свой протокол, основан на HTTP и JSON, что близко к REST.

Инструменты для разработки и тестирования

  • Postman: популярный инструмент для тестирования REST API.
  • Swagger/OpenAPI: спецификация для документирования API.
  • cURL: командная утилита для отправки HTTP-запросов.
  • Insomnia: альтернатива Postman с открытым исходным кодом.

Заключение

RESTful веб-сервисы стали стандартом де-факто для построения современных API благодаря своей простоте, масштабируемости и совместимости с веб-технологиями. Несмотря на появление альтернатив (GraphQL, gRPC), REST остаётся наиболее распространённым подходом, особенно в государственных и корпоративных системах России. Его ключевые принципы — единообразие интерфейса, отсутствие состояния и кэширование — обеспечивают эффективную и надёжную работу распределённых приложений.

Источники:

  • Fielding, R. T. (2000). Architectural Styles and the Design of Network-based Software Architectures. Doctoral dissertation, University of California, Irvine.
  • Richardson, L., & Ruby, S. (2007). RESTful Web Services. O'Reilly Media.
  • Masse, M. (2011). REST API Design Rulebook. O'Reilly Media.
  • Документация API портала «Госуслуги» (gosuslugi.ru).
  • Спецификация OpenAPI 3.0 (openapis.org).

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

На главную BFOmetr →