RESTful API
RESTful API (Representational State Transfer Application Programming Interface) — это архитектурный стиль взаимодействия компонентов распределённого приложения в сети, основанный на наборе принципов и ограничений, определяющих, как клиентские и серверные приложения обмениваются данными. REST (сокр. от англ. Representational State Transfer, «передача репрезентативного состояния») был предложен в 2000 году Роем Филдингом (Roy Fielding) в его докторской диссертации как альтернатива более сложным протоколам, таким как SOAP. RESTful API использует протокол HTTP в качестве транспортного уровня и оперирует с ресурсами, представленными в форматах JSON, XML, HTML или других.
Основные принципы и ограничения
Архитектура REST основана на шести ключевых ограничениях (constraints), которые отличают её от других подходов к построению API:
Клиент-серверная архитектура (Client-Server)
Система разделяется на две части: клиент (пользовательский интерфейс) и сервер (хранилище данных и бизнес-логика). Клиент не заботится о хранении данных, а сервер — о пользовательском интерфейсе. Это позволяет разрабатывать и масштабировать компоненты независимо.
Отсутствие состояния (Stateless)
Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для его обработки. Сервер не хранит никакой информации о состоянии клиента между запросами (сессионные данные). Это повышает надёжность и масштабируемость, но требует передачи аутентификационных токенов или других данных при каждом запросе.
Кэширование (Cacheability)
Ответы сервера должны явно указывать, могут ли они быть кэшированы клиентом или промежуточными прокси-серверами. Правильное кэширование снижает нагрузку на сервер и уменьшает задержки.
Единообразие интерфейса (Uniform Interface)
Фундаментальное ограничение, упрощающее архитектуру. Включает четыре подпринципа:
- Идентификация ресурсов — каждый ресурс (например, пользователь, товар, заказ) имеет уникальный идентификатор (URI).
- Манипуляция ресурсами через представления — клиент работает с представлением ресурса (JSON, XML), а не с самим ресурсом. Сервер может менять внутреннюю реализацию, не меняя API.
- Самодокументируемые сообщения — каждое сообщение содержит достаточно информации, чтобы клиент мог понять, как его обработать (например, ссылки на связанные ресурсы — HATEOAS).
- Hypermedia as the Engine of Application State (HATEOAS) — клиент динамически переходит по ссылкам, предоставленным сервером, а не использует жёстко заданные пути. Это делает API самоописываемым и позволяет серверу менять структуру без нарушения работы клиентов.
Многоуровневая система (Layered System)
Архитектура может состоять из нескольких иерархических слоёв (балансировщики нагрузки, прокси-серверы, шлюзы). Каждый слой взаимодействует только с соседними, что повышает масштабируемость и безопасность.
Код по требованию (Code on Demand, опционально)
Сервер может временно расширять функциональность клиента, передавая исполняемый код (например, JavaScript-скрипты). Это единственное опциональное ограничение.
HTTP-методы и работа с ресурсами
RESTful API использует стандартные HTTP-методы для выполнения операций над ресурсами. Каждый метод имеет определённую семантику:
| HTTP-метод | Операция | Идемпотентность | Безопасность |
|---|---|---|---|
| GET | Получение ресурса или списка ресурсов | Да | Да |
| POST | Создание нового ресурса или выполнение действия | Нет | Нет |
| PUT | Полная замена ресурса (или создание, если ресурс не существует) | Да | Нет |
| PATCH | Частичное обновление ресурса | Нет (обычно) | Нет |
| DELETE | Удаление ресурса | Да | Нет |
Идемпотентность означает, что повторное выполнение одного и того же запроса приводит к тому же состоянию сервера (например, повторный DELETE не вызовет ошибку, а просто вернёт 404). Безопасность — метод не изменяет состояние сервера.
Примеры URI и методов
GET /users— получить список всех пользователей.GET /users/123— получить пользователя с ID 123.POST /users— создать нового пользователя (тело запроса содержит JSON с данными).PUT /users/123— полностью обновить пользователя 123.PATCH /users/123— частично обновить пользователя 123 (например, только email).DELETE /users/123— удалить пользователя 123.
Форматы представления данных
Наиболее распространённые форматы для обмена данными в RESTful API:
- JSON (JavaScript Object Notation) — лёгкий, удобочитаемый, поддерживается большинством языков программирования. Стандарт де-факто.
- XML (eXtensible Markup Language) — более тяжёлый, но используется в корпоративных системах и устаревших интеграциях.
- YAML — реже, но применяется в конфигурационных файлах и некоторых API.
- HTML — для API, которые возвращают готовые фрагменты веб-страниц (например, для серверного рендеринга).
Клиент указывает желаемый формат через HTTP-заголовок Accept, сервер — через Content-Type.
Статус-коды HTTP
RESTful API использует стандартные HTTP-статус-коды для информирования клиента о результате запроса. Основные группы:
- 2xx (Успех):
200 OK— успешный GET, PUT, PATCH, DELETE.201 Created— успешный POST (создание ресурса).204 No Content— успешный DELETE или PUT/PATCH без тела ответа.- 3xx (Перенаправление):
301 Moved Permanently— ресурс перемещён на новый URI.304 Not Modified— кэшированный ответ актуален.- 4xx (Ошибка клиента):
400 Bad Request— некорректный синтаксис запроса.401 Unauthorized— требуется аутентификация.403 Forbidden— доступ запрещён.404 Not Found— ресурс не найден.405 Method Not Allowed— метод не поддерживается для данного URI.409 Conflict— конфликт (например, попытка создать дубликат).422 Unprocessable Entity— семантическая ошибка (например, невалидные данные).- 5xx (Ошибка сервера):
500 Internal Server Error— неожиданная ошибка сервера.503 Service Unavailable— сервер временно недоступен.
Версионирование API
По мере развития API его интерфейс может меняться. Чтобы не нарушать работу старых клиентов, применяют версионирование. Основные подходы:
- Версия в URI:
https://api.example.com/v1/usershttps://api.example.com/v2/users., - Версия в заголовке:
Accept: application/vnd.example.v1+json. - Версия в параметре запроса:
https://api.example.com/users?version=1`.
Наиболее распространённый и простой способ — версионирование через URI.
Аутентификация и авторизация
RESTful API часто требует идентификации клиента. Основные методы:
- Basic Auth — передача имени пользователя и пароля в заголовке
Authorization(небезопасно без HTTPS). - API-ключи — статический ключ, передаваемый в заголовке или параметре запроса.
- Bearer Token (JWT) — токен, выдаваемый после аутентификации, передаётся в заголовке
Authorization: Bearer <token>. JWT (JSON Web Token) содержит утверждения о пользователе и подписан сервером. - OAuth 2.0 — протокол делегированного доступа, позволяющий сторонним приложениям получать ограниченный доступ к ресурсам от имени пользователя без передачи его пароля.
Преимущества и недостатки
Преимущества
- Простота и понятность — основан на стандартных HTTP-методах и кодах.
- Масштабируемость — отсутствие состояния и кэширование позволяют легко наращивать серверные мощности.
- Независимость клиента и сервера — клиенты могут быть написаны на любом языке, поддерживающем HTTP.
- Широкая поддержка — все современные языки и платформы имеют встроенные или библиотечные средства для работы с HTTP и JSON.
- Кэширование — снижает нагрузку и ускоряет ответы.
Недостатки
- Избыточность данных — часто возвращается больше данных, чем нужно клиенту (проблема решается через GraphQL или частичные ответы).
- Сложность с множественными запросами — для получения связанных данных может потребоваться несколько запросов (N+1 problem).
- Ограниченность HATEOAS — на практике большинство API не реализуют гипермедиа полностью, что снижает самодокументируемость.
- Отсутствие строгой спецификации — REST — это стиль, а не стандарт, что приводит к разночтениям в реализации.
Пример реализации (упрощённый)
Запрос на создание пользователя:
``` POST /api/users HTTP/1.1 Host: example.com Content-Type: application/json Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
{ "name": "Иван Петров", "email": "ivan@example.com", "password": "securePassword123" } ```
Ответ:
``` HTTP/1.1 201 Created Content-Type: application/json Location: /api/users/42
{ "id": 42, "name": "Иван Петров", "email": "ivan@example.com", "createdAt": "2024-01-15T10:30:00Z" } ```
RESTful API и GraphQL
GraphQL (разработан Facebook в 2015 году) является альтернативой RESTful API. В отличие от REST, где сервер определяет структуру ответа, GraphQL позволяет клиенту запрашивать только нужные поля и агрегировать данные из нескольких ресурсов в одном запросе. REST остаётся более простым и зрелым решением для большинства типовых задач, в то время как GraphQL лучше подходит для сложных, быстро меняющихся интерфейсов с множеством взаимосвязей.
Применение в России
В России RESTful API активно используется в государственных информационных системах (например, портал «Госуслуги», Единая система идентификации и аутентификации — ЕСИА), в банковском секторе (Сбербанк, Т-Банк, ВТБ) и в коммерческих сервисах (Яндекс, Ozon, Wildberries). Российские разработчики следуют тем же принципам, что и международное сообщество, с учётом требований законодательства о персональных данных (ФЗ-152).
Источники
- Fielding, R. T. (2000). Architectural Styles and the Design of Network-based Software Architectures (докторская диссертация, Калифорнийский университет в Ирвайне).
- Richardson, L., & Ruby, S. (2007). RESTful Web Services. O'Reilly Media.
- Masse, M. (2011). REST API Design Rulebook. O'Reilly Media.
- Документация по HTTP-протоколу (RFC 7230-7235).
- Статьи и руководства по RESTful API на ресурсах MDN Web Docs, IBM Developer и Microsoft Docs.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →