Проще говоря, REST — это набор правил о том, как клиент (например, веб-браузер или мобильное приложение) и сервер должны общаться друг с другом через интернет.
Ключевые принципы REST (6 ограничений)
1. Единообразие интерфейса (Uniform Interface): Это самый важный принцип. Он означает, что взаимодействие между клиентом и сервером должно быть стандартным и предсказуемым.
o Ресурсы: Все данные и функциональность представляются как ресурсы (например, пользователь, товар, заказ). Каждый ресурс имеет уникальный идентификатор (URI).
o Манипуляция ресурсами через представления: Клиент работает с ресурсом через его "представление" (например, в формате JSON или XML). Если у клиента есть нужные права, он может изменить или удалить ресурс на сервере, отредактировав его представление.
o Самодостаточые сообщения: Каждое сообщение от клиента к серверу должно содержать всю информацию, необходимую для его обработки. Сервер не должен хранить состояние сессии клиента (см. Stateless ниже).
o HATEOAS (Hypermedia as the Engine of Application State): Ответы от сервера должны содержать гиперссылки, позволяющие клиенту динамически обнаруживать доступные действия. Например, ответ о заказе может содержать ссылки "cancel_order": "/orders/123/cancel".
2. Отсутствие состояния (Stateless): Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его понимания и выполнения. Сервер не хранит никаких данных о сессии клиента между запросами. Это делает систему более надежной и легко масштабируемой.
3. Кэшируемость (Cacheable): Ответы от сервера должны явно указывать, можно ли их кэшировать и как долго. Это значительно повышает производительность, уменьшая количество запросов к серверу.
4. Клиент-серверная архитектура (Client-Server): Четкое разделение обязанностей. Клиент отвечает за пользовательский интерфейс и взаимодействие с пользователем, а сервер — за хранение данных, бизнес-логику и управление ресурсами. Это позволяет им развиваться независимо.
5. Многоуровневая система (Layered System): Архитектура может состоять из нескольких уровней (например, сервер приложений, сервер базы данных, балансировщик нагрузки). Клиент не знает и не должен знать, на каком именно уровне обрабатывается его запрос.
6. Код по требованию (Code on Demand, опционально): Сервер может временно расширять функциональность клиента, передавая ему исполняемый код (например, JavaScript). Это единственное необязательное ограничение.
REST на практике: RESTful API
Веб-сервис, который следует принципам REST, называется RESTful API.
Самый распространенный пример — это взаимодействие с сервером с помощью HTTP-методов и URL-адресов.
· Ресурс: Пользователь
· Уникальный идентификатор (URI): https://api.example.com/users/123
|
Действие |
HTTP-метод |
URL |
Что делает? |
|
Получить пользователя |
GET |
/users/123 |
Чтение данных. Безопасный метод. |
|
Создать нового пользователя |
POST |
/users |
Создание нового ресурса. |
|
Изменить данные пользователя |
PUT или PATCH |
/users/123 |
Полное обновление (PUT) или частичное (PATCH). |
|
Удалить пользователя |
DELETE |
/users/123 |
Удаление ресурса. |
Пример запроса и ответа:
· Запрос (клиент -> сервер):
http
GET /users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer <token>
· Ответ (сервер -> клиент):
http
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 123,
"name": "Иван Иванов",
"email": "ivan@example.com",
"links": [
{
"rel": "self",
"href": "/users/123"
},
{
"rel": "orders",
"href": "/users/123/orders"
}
]
}
Простая аналогия
Представьте, что REST — это работа с меню в ресторане:
· Меню (API документация) содержит список всех доступных блюд (ресурсов).
· Вы делаете заказ (HTTP-запрос), называя конкретное блюдо по его названию (URI) и используя определенный глагол ("Я хочу получить...", "Я хочу заказать...").
· Официант (клиент) передает ваш заказ на кухню (сервер).
· Кухня (сервер) готовит блюдо и передает его официанту. Кухня не помнит, что вы заказывали в прошлый раз (stateless).
· Официант приносит вам готовое блюдо (ответ с данными в формате JSON/XML).
Итог
REST — это популярный, простой и эффективный архитектурный стиль, который использует стандартные возможности протокола HTTP для создания масштабируемых и надежных веб-сервисов (RESTful API). Подавляющее большинство современных публичных API (Google, Twitter, GitHub и т.д.) являются RESTful.