Что такое архитектура REST и как она реализована в Rails? - PullRequest
12 голосов
/ 18 мая 2010

Это то, что я думаю об архитектуре REST.

Для каждого ресурса существует уникальный URI.

Мы можем манипулировать этим объектом, используя его URI и HTTP-действия [POST, GET, PUT и DELETE]. HTTP-запрос передает представление состояния этого объекта.

Во всех текстах, которые я прочитал, REST объясняется странным и запутанным образом.

Еще одна вещь, реализация RESTFUL в rails создает разные URL для разных целей. Как / команды -> для метода «индекс» ... / команды / новый -> для метода «новый» и так далее. Разве это не отходит от отдыха, который определяет, что каждый ресурс имеет один уникальный URI ???

Ответы [ 5 ]

8 голосов
/ 19 мая 2010

Я думаю, что вы хорошо понимаете REST. Это не должно быть сложнее, чем должно быть. Также @Surya обрисовывает в общих чертах некоторые очень хорошие моменты.

Способ, которым Rails отображает методы HTTP на методы контроллера:

GET    => show
PUT    => update
POST   => create
DELETE => destroy

Два других ресурса / метода, которые предоставляет rails, а именно:

resource/new  => new
resource/edit => edit

скорее всего не ресурсы для практических целей, но они необходимы для создания веб-страниц и приложений. Если бы клиент имел полное представление о ресурсе, они бы не были нужны. Клиент может просто делать вызовы POST и PUT с информацией о ресурсах и создавать или обновлять ресурсы по мере необходимости. Но поскольку от пользователей не требуется знать все входы и выходы ресурса, им необходим более простой интерфейс для создания или обновления.

Если бы все пользователи были полностью осведомлены о ресурсах и были достаточно умелыми с командной строкой, нам бы даже не понадобился HTML. Они могут просто curl во взаимодействии с этими ресурсами:)

index просто облегчает работу с коллекциями. Это все еще хорошо определенный ресурс и имеет уникальное представление, например /books. То, как он обрабатывается в коде на стороне сервера, не делает его RESTless (я только что это придумал, но это здорово).

6 голосов
/ 18 мая 2010

Я бы начал с главы 5 диссертации Роя Филдинга. Есть несколько основных принципов:

  • Ресурсы. Ресурс, как правило, может быть чем-то, что вы представляете внешнему миру как часть своего сервиса. Акцент делается на выявлении ресурсов (например, Book, UserList, CalculateDistance)
  • URI: присвойте каждому ресурсу идентификатор (например, example.com/books/7654)
  • Унифицированный интерфейс: используйте стандартные методы, такие как GET, PUT. POST, DELETE, HEAD, OPTIONS
  • Представления: ресурс может иметь несколько представлений. Например, GET для книги может вернуть PDF с содержанием этой книги, HTML с содержимым и даже GIF с обложкой книги и так далее. Представление - это, по сути, совокупность всех данных и разметки.
  • Гипермедиа: Это, на мой взгляд, очень важный принцип. Реализация этого принципа делает ваше приложение намного впереди обычных CRUD-подобных определений, в которые встроен REST-стиль. HATEOAS - это аббревиатура, обозначающая Hypermedia как движок состояния приложения. Когда вы нажимаете на ссылку или отправляете форму, вы изменяете состояние приложения, это происходит с помощью гиперссылок (или гипермедиа). Существует очень слабая связь между сервером и клиентом. Клиент перемещается по приложению по ссылкам, предоставленным сервером. (в блогосфере ведется много дискуссий на эту тему ...) [Также посмотрите Restfulie ]

Я недавно ответил на вопрос о хороших ресурсах для изучения REST, может быть полезным.

Я не знаком с Rails, поэтому не обращаюсь к этой части вопроса.

4 голосов
/ 13 марта 2017

Вот мой основной план ОТДЫХА. Я попытался продемонстрировать мышление каждого из компонентов в архитектуре RESTful, чтобы понимание концепции было более интуитивным. Надеюсь, это поможет демистифицировать REST для некоторых людей!

REST (Передача репрезентативного состояния) - это архитектура проекта, которая описывает, как сетевые ресурсы (т.е. узлы, которые совместно используют информацию) проектируются и адресуются. В целом, архитектура RESTful делает так, чтобы клиент (запрашивающий компьютер) и сервер (отвечающий компьютер) могли запрашивать чтение, запись и обновление данных, при этом клиенту не нужно знать, как работает сервер, и сервер может пройти назад без необходимости знать что-либо о клиенте. Хорошо, круто ... но как мы можем это сделать на практике?

  • Наиболее очевидным требованием является наличие какого-либо универсального языка, чтобы сервер мог сообщить клиенту, что он пытается сделать с запросом, и чтобы сервер ответил.

  • Но чтобы найти какой-либо конкретный ресурс и затем сообщить клиенту, где он находится, необходим универсальный способ указания ресурсов. Это где универсальные идентификаторы ресурсов (URI) приходят; это в основном уникальные адреса для поиска ресурсов.

Но архитектура REST на этом не заканчивается! Хотя вышеперечисленное удовлетворяет основные потребности того, что мы хотим, мы также хотим иметь архитектуру, которая поддерживает большой объем трафика, поскольку любой данный сервер обычно обрабатывает ответы от ряда клиентов. Таким образом, мы не хотим перегружать сервер, заставляя его запоминать информацию о предыдущих запросах.

  • Поэтому мы налагаем ограничение на то, что каждая пара запрос-ответ между клиентом и сервером независима, то есть сервер не должен ничего помнить о предыдущих запросах (предыдущих состояниях взаимодействия клиент-сервер). ) ответить на новый запрос. Это означает, что мы хотим, чтобы наши взаимодействия не имели состояния.

  • Чтобы еще больше облегчить нагрузку на наш сервер от повторения вычислений, которые недавно были выполнены для данного клиента, REST также позволяет кэшировать. По сути, кэширование означает создание снимка исходного ответа, предоставленного клиенту. Если клиент делает тот же самый запрос снова, сервер может предоставить клиенту моментальный снимок, а не повторять все вычисления, которые были необходимы для создания начального ответа. Однако, поскольку это моментальный снимок, если моментальный снимок не истек - сервер заранее устанавливает время истечения - и ответ был обновлен с момента первоначального кэша (т. Е. Запрос дал бы ответ, отличный от кэшированного ответа) клиент не увидит обновления до тех пор, пока не истечет срок действия кеша (или кеш не будет очищен) и ответ не будет обработан с нуля.

  • Последнее, что вы часто будете здесь о архитектурах RESTful, - это их многоуровневость. На самом деле мы уже неявно обсуждали это требование в нашем обсуждении взаимодействия между клиентом и сервером. По сути, это означает, что каждый слой в нашей системе взаимодействует только с соседними слоями. Таким образом, в нашем обсуждении уровень клиента взаимодействует с уровнем нашего сервера (и наоборот), но могут существовать и другие уровни сервера, которые помогают основному серверу обрабатывать запрос, с которым клиент не связывается напрямую. Скорее сервер передает запрос по мере необходимости.

НетЕсли все это звучит знакомо, то отлично. Протокол передачи гипертекста (HTTP), который определяет протокол связи через World Wide Web, является реализацией абстрактного понятия архитектуры RESTful (или экземпляром класса REST, если вы фанат ООП, как я). В этой реализации REST клиент и сервер взаимодействуют через GET, POST, PUT, DELETE и т. Д., Которые являются частью универсального языка, и ресурсы можно указывать с помощью URL.

2 голосов
/ 18 мая 2010

Как вы могли заметить, существует 4 HTTP-действия, но основные операции CRUD в типичном веб-приложении требуют 7 различных действий. Некоторые из них на самом деле ничего не делают (например, /new и :id/edit) и, таким образом, являются своего рода параллелью REST-архитектуре. Кроме того, действие index действует не на ресурс, а скорее на коллекцию ресурса (таким образом, также уникальный URL).

Итак, основные 4 действия HTTP отображаются на ресурс, подобный этому:

  • ПОЛУЧИТЬ карты, чтобы показать -> get /teams/:id
  • PUT карты для обновления -> put /teams/:id
  • УДАЛИТЬ карты для уничтожения -> delete /teams/:id
  • POST - исключение, так как ресурс еще не существует, поэтому он отображается на базу /teams

Итак, подведем итог: каждый ресурс имеет свой уникальный URL-адрес, а rails определяет несколько дополнительных URL-адресов для пользовательского интерфейса и для сбора данных.

1 голос
/ 19 мая 2010

Мне нравится / команды -> для метода 'index' ... / команды / новый -> для «нового» метода и так на. Разве это не уходит от отдыха, который определяет, что каждый ресурс имеет один уникальный URI ???

Нет, это не уходит от REST, потому что для REST /teams и /teams/new - это два разных ресурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...