REST - Representational State Transfer (передача состояния представления) - архитектурный стиль обмена данными между разными компонентами системы, каждая из которых может физически располагаться в разных местах.
Представляет собой согласованный набор ограничений, учитываемых при проектировании удаленной системы.
- надежность в виде отсутствия необходимости сохранять информацию о состояни клиентов;
- производительность за счет использования кэша;
- масштабируемость;
- прозрачность системы взаимодействия;
- простота интерфейсов;
- портативность компонентов;
- легкость внесения изменений;
В общем случае компоненты распределенной системы взаимодействуют друг с другом посредством запросов-ответов по протоколу HTTP.
Ограничение заключается в раграничении потребностей клиентского интерфейса от потребностей сервера, хранящего данные. Данное ограничение повышает переносимость клиентского кода на другие платформы, а упрощение серверной части улучшает масштабируемость системы.
В период между запросами серверу не нужно хранить информацию о состоянии клиента и наоборот. Все запросы от клиента должны быть составлены со всей необходимой для выполнения запроса сервером информации.
Клиенты могут выполнять кеширование ответов сервера, у которых должно быть обозначение как кэшируемых или некэшируемых для поддержания правильноти и аткуальности данных.
Наличие общего формата запросов для сервера и ответов для клиентов
Иерархическая структура сетей с применением промежуточных серверов. Применение промежуточных серверов способно повысить масштабируемость за счёт балансировки нагрузки и распределённого кэширования.
Коммуникация проходит путем запросов-ответов.
Запросы состоят содержат:
- HTTP метод;
- заголовок;
- URI;
- тело запроса - JSON или XML.
Ресурсы - все то, что может иметь имя, аналоги классов в Java: пользователь, отчет, запрос, заказ, картинка, видео, анимацией, PDF.
Клиенты отпраляют запросы на эндпоинты - аналог адреса в сети - URI: последовательность символов, идентифицирующая абстрактный или физический ресурс. Uniform Resource Identifier — унифицированный идентификатор ресурса.
URI - путь до ресурса, для каждого ресурса он уникален.
URI в REST начинается с множественной формы существительного, описывающего некоторый ресурс. Например, со слова clients. Далее через слэш указывают ID — идентификатор некоторого конкретного клиента.
/clients — URI всех имеющихся клиентов;
/clients/23 — URI конкретного клиента, а именно клиента с ID=23;
/clients/4 — URI конкретного клиента, а именно клиента с ID=4.
Можно продолжить URI, добавив к нему заказы:
/clients/4/orders — URI всех заказов клиента №4;
/clients/1/orders/12 — URI заказа №12 клиента №1.
Если мы продолжим эту цепочку и добавим еще и товары, получим:
/clients/1/orders/12/items — URI списка всех товаров в заказе №12 сделанного клиентом №1.
С уровнями вложенности главное — делать URI интуитивно понятными.
| Запрос | Описание |
|---|---|
| GET /clients/23 Accept : application/json, application/xml |
Получить информацию о клиенте №23 в формате json или xml |
| POST /clients { "name" : "Amigo", "email" : "amigo@jr.com", "phone" : "+7 (191) 746-43-23" } |
Создать нового клиента с полями: Имя — Amigo Email — amigo@jr.com Тел. — +7 (191) 746-43-23 |
| PUT /clients/1 { "name" : "Ben", "email" : "bigben@jr.com", "phone" : "+380 (190) 346-42-13" } |
Редактировать клиента №1 в следующим образом: Имя — Ben Email — bigben@jr.com Тел. — +380 (190) 346-42-13 |
| DELETE /clients/12/orders/6 | Удалить из системы заказ №6 у клиента №12 |