Одна из причин популярности веб-приложений заключается в возможности масштабирования нагрузки и разделение обязанностей между компонентами системы. Для управления сложностью веб-приложений используется клиент-серверная архитектура, которая позволяет не только разделять обязанности, но и значительно усложнять серверную составляющую, делая ее многоуровневой с большим количеством промежуточных звеньев.
Так как большую часть веб-приложения занимает не бизнес-составляющая, а инфраструктура, возникает задача управления над корректной передачей состояния бизнес-логики. Чтобы использовать все преимущества распределенных систем, был придуман архитектурный стиль REST, а его адаптация на веб-приложения стала называться RESTful. Говоря про REST-прилоежния чаще всего имеются в виду именно RESTful приложения.
В этом стриме мы рассмотрим основные архитектурные моменты, связанные с построением таких приложений. Предложенные принципы и правила позволят строить и расширять веб-приложения, не нарушая принципов REST и получая все преимущества таких систем.
REST не является конкретным паттерном, а является архитектурным стилем, поэтому большое множество разных решений могут подходить под требования REST. Этого достаточно, чтобы получить все бонусы использования этого архитектурного стиля.
Ограничения следующие:
Ресурсы - это структура наполненная данными, количество данных исчерпывающе для описанного ресурса. Структура хранится целеком, но может быть отображена по-разному. Пользователь получает отображение ресурса, а не сам ресурс.
REST приложения не обязаны основываться на HTTP протоколе, но практические реализации REST реализованы в веб-приложениях, работающих на HTTP. Поэтому на практике REST представлен RESTful.
HTTP запросы можно взаимооднозначно отобразить на функции:
В предложенной реализации REST есть возможность объединять в рамках одного запроса несколько действий:
GET(/users/:id/posts/2022)
POST(/users/:id/posts, []) = 2022 # обновляется алиас, но предыдущие коллекции остаются по их URN
PUT(2022, GET(users/:id/posts, params: {filter: {year = 2022}}))
GET(/users/:id/posts/2022) # возвращает результат значит является представлением и должно примениться правило развертывания
Но мы можем сократить лишние действия и получить REST, который будет работать в рамках предложенных ограничений: "` GET(/users/:id/posts/2022) => GET(users/:id/posts, params: {filter: {year = 2022}}))
"`
временная коллекция, которую можно получить путем фильтрации