RESTful API, или просто REST API, — это один из самых популярных архитектурных подходов для организации взаимодействия между клиентом и сервером.
RESTful API и REST API часто
используются как обозначение одного и того же, но между ними есть небольшие различия.
REST API
- это общее название для API, которое следует принципам REST.
RESTful API - API, которое полностью соответствуют всем принципам и ограничениям REST.
Архитектурные принципы REST
1. Клиент-серверная архитектура
Принцип: Клиент (например, приложение или браузер) и сервер (место, где хранятся и обрабатываются данные) отделены друг от друга и взаимодействуют через API. Клиент отправляет запросы, а сервер обрабатывает их и возвращает ответы.
Пример:
- Браузер отправляет запрос
GET /api/products/1
, чтобы получить информацию о товаре с ID1
. - Сервер обрабатывает запрос и возвращает JSON с данными о товаре.
Преимущество: клиент и сервер могут развиваться независимо друг от друга, сохраняя совместимость.
2. Без состояния (Statelessness)
Принцип: Сервер не хранит состояние клиента между запросами. Каждый запрос должен содержать всю необходимую информацию для его выполнения.
Пример:
- Пользователь делает первый запрос:
GET /api/products/1
, и получает данные. - Если пользователь делает второй запрос, например, для создания заказа,
запрос
POST /api/orders
включает всю информацию о заказе (например, ID товара, количество) и, возможно, токен аутентификации.
Преимущество: каждый запрос обрабатывается независимо, что упрощает масштабирование сервера.
3. Кеширование (Cacheability)
Принцип: Ответы от сервера могут быть помечены как кешируемые, что позволяет клиенту временно хранить ответ и использовать его, не отправляя повторные запросы к серверу.
Пример:
- Запрос на получение списка
товаров
GET /api/products
может вернуть ответ с заголовкомCache-Control: max-age=3600
. - Это значит, что клиент может повторно использовать этот ответ в течение одного часа (3600 секунд), не обращаясь к серверу.
Преимущество: кеширование снижает нагрузку на сервер и ускоряет работу клиента.
4. Единообразие интерфейса (Uniform Interface)
Принцип: API должен быть логичным и последовательным. Это значит, что эндпоинты и их структура должны быть предсказуемыми и соответствовать REST-стандартам.
Пример:
- Для доступа к товарам и пользователям API может иметь такие пути:
GET /api/products - получение списка товаров GET /api/products/1 - получение конкретного товара GET /api/users - получение списка пользователей
- Единообразие помогает быстро понять структуру API и избежать ошибок.
Преимущество: упрощает использование API, поскольку структуры запросов и ответов предсказуемы.
5. Разделение по слоям (Layered System)
Принцип: Архитектура API может включать несколько слоёв, каждый из которых выполняет свою роль, например, маршрутизация запросов, балансировка нагрузки, безопасность. Это позволяет отделять логику приложения от логики хранения данных и работы с пользователями.
Пример:
- Запрос проходит через балансировщик нагрузки, который распределяет запросы между несколькими серверами для повышения скорости и отказоустойчивости.
- Серверы обращаются к базе данных или другим сервисам через свои внутренние слои, но клиент видит только один конечный адрес.
Преимущество: упрощает управление, масштабирование и защиту API.
6. Код по запросу (Code on Demand, опционально)
Принцип: Сервер может отправить клиенту исполняемый код, который клиент может использовать для выполнения некоторых действий. Этот принцип используется нечасто и в основном применяется в веб-приложениях.
Пример:
- Сервер может вернуть клиенту JavaScript-код, чтобы его приложение могло выполнить дополнительные вычисления на стороне клиента.
- Например, веб-приложение может запрашивать динамическую форму, и сервер отправит HTML или JavaScript для создания формы на стороне клиента.
Преимущество: позволяет уменьшить нагрузку на сервер и добавляет гибкость клиентским приложениям.
Эти принципы помогают сделать REST API надёжным, гибким и масштабируемым. Когда API следует этим принципам, оно остаётся удобным и предсказуемым для пользователей и разработчиков.