REST: различия между версиями
[непроверенная версия] | [непроверенная версия] |
APh (обсуждение | вклад) викификация |
Obscuraa (обсуждение | вклад) отмена правки 136037833 участника 81.9.113.89 (обс.) Метка: отмена |
||
(не показано 27 промежуточных версий 21 участника) | |||
Строка 1: | Строка 1: | ||
'''REST''' (от {{lang-en|''' |
'''REST''' (от {{lang-en|'''RE'''presentational '''S'''tate '''T'''ransfer}} — «передача репрезентативного состояния» или «передача „самоописываемого“ состояния») — [[Архитектура программного обеспечения|архитектурный стиль]] взаимодействия компонентов распределённого приложения в [[вычислительная сеть|сети]]. Другими словами, REST — это набор правил того, как программисту организовать написание кода серверного приложения, чтобы все системы легко обменивались данными и приложение можно было масштабировать<ref>{{Cite web|lang=ru-RU|url=https://www.youtube.com/watch?v=J4Fy6lmLBr0|title=Что такое REST API|access-date=2021-08-11|archive-date=2021-08-11|archive-url=https://web.archive.org/web/202108111430/https://www.youtube.com/watch?v=J4Fy6lmLBr0|deadlink=no}}</ref>. REST представляет собой согласованный набор ограничений, учитываемых при проектировании распределённой [[гипермедиа]]-системы. В определённых случаях ([[интернет-магазин]]ы, [[Поисковая система|поисковые системы]]; прочие системы, основанные на данных) это приводит к повышению производительности и упрощению архитектуры. В широком смысле{{уточнить}} компоненты в REST взаимодействуют наподобие взаимодействия клиентов и серверов во [[Всемирная паутина|Всемирной паутине]]. REST является альтернативой [[Удалённый вызов процедур|RPC]]<ref>{{книга|автор=Машнин Тимур Сергеевич|заглавие=Технология Web-сервисов платформы Java|издательство=БХВ-Петербург|год=2012|страницы=115|страниц=560|isbn=978-5-9775-0778-3|ответственный=|издание=|место=|isbn2=}}</ref>. |
||
В |
В [[Интернет|интернете]] [[Удалённый вызов процедур|вызов удалённой процедуры]] может представлять собой обычный [[HTTP]]-запрос (обычно [[HTTP|GET]] или [[POST (HTTP)|POST]]; такой запрос называют ''«REST-запрос»''), а необходимые данные передаются в качестве [[параметр]]ов запроса<ref name="Fielding-Ch5" /><ref name=autogenerated1>{{cite web |url=http://tech.groups.yahoo.com/group/rest-discuss/message/6735 |title=Fielding discussing the definition of the REST term |publisher=Tech.groups.yahoo.com |accessdate=2013-11-28 |archive-date=2010-10-22 |archive-url=https://web.archive.org/web/20101022222125/http://tech.groups.yahoo.com/group/rest-discuss/message/6735 |deadlink=no }}</ref>. |
||
Для [[веб-служба|веб-служб]], построенных с учётом REST (то есть не нарушающих накладываемых им ограничений), применяют термин «'''RESTful'''». |
Для [[веб-служба|веб-служб]], построенных с учётом REST (то есть не нарушающих накладываемых им ограничений), применяют термин «'''RESTful'''». |
||
Строка 8: | Строка 8: | ||
== История термина == |
== История термина == |
||
Хотя данная [[концепция]] лежит в самой основе [[Всемирная паутина|Всемирной паутины]], термин «REST» был введён [[Филдинг, Рой|Роем Филдингом]], одним из создателей протокола «[[HTTP]]», лишь в 2000 году<ref name=autogenerated1 />. В своей диссертации ''«Архитектурные стили и дизайн сетевых программных архитектур» («Architectural Styles and the Design of Network-based Software Architectures»)''<ref>{{Cite web|accessdate = 2015-12-01|title = Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST)|url = http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm|publisher = www.ics.uci.edu}}</ref> в [[Калифорнийский университет в Ирвайне|Калифорнийском университете в Ирвайне]]<ref name="Fielding-Ch5">Chapter 5 of Roy Fielding’s dissertation [http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm «Representational State Transfer (REST)»]</ref> он подвёл теоретическую основу под способ взаимодействия [[Клиент (информатика)|клиентов]] и [[Сервер (программное обеспечение)|серверов]] во [[Всемирная паутина|Всемирной паутине]], абстрагировав его и назвав «передачей представительного состояния» («Representational State Transfer'''»'''). Филдинг описал концепцию построения распределённого приложения, при которой каждый запрос (REST-запрос) клиента к серверу содержит в себе исчерпывающую информацию о желаемом ответе сервера (желаемом представительном состоянии), и сервер не обязан сохранять информацию о состоянии клиента («клиентской сессии»). |
Хотя данная [[концепция]] лежит в самой основе [[Всемирная паутина|Всемирной паутины]], термин «REST» был введён [[Филдинг, Рой|Роем Филдингом]], одним из создателей протокола «[[HTTP]]», лишь в 2000 году<ref name=autogenerated1 />. В своей диссертации ''«Архитектурные стили и дизайн сетевых программных архитектур» («Architectural Styles and the Design of Network-based Software Architectures»)''<ref>{{Cite web|accessdate = 2015-12-01|title = Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST)|url = http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm|publisher = www.ics.uci.edu|archive-date = 2021-05-13|archive-url = https://web.archive.org/web/20210513160155/https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm|deadlink = no}}</ref> в [[Калифорнийский университет в Ирвайне|Калифорнийском университете в Ирвайне]]<ref name="Fielding-Ch5">Chapter 5 of Roy Fielding’s dissertation [http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm «Representational State Transfer (REST)»] {{Wayback|url=http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm |date=20210513160155 }}</ref> он подвёл теоретическую основу под способ взаимодействия [[Клиент (информатика)|клиентов]] и [[Сервер (программное обеспечение)|серверов]] во [[Всемирная паутина|Всемирной паутине]], абстрагировав его и назвав «передачей представительного состояния» («Representational State Transfer'''»'''). Филдинг описал концепцию построения распределённого приложения, при которой каждый запрос (REST-запрос) клиента к серверу содержит в себе исчерпывающую информацию о желаемом ответе сервера (желаемом представительном состоянии), и сервер не обязан сохранять информацию о состоянии клиента («клиентской сессии»). |
||
Стиль «REST» развивался параллельно с «[[HTTP 1.1]]», разработанным в 1996—1999 годах, основываясь на существующем дизайне «[[HTTP]] 1.0», разработанном в [[1996 год]]у<ref>{{Cite web|accessdate = 2015-12-01 |date = 2009-11-11 |title = rest-discuss : Message: Re: [rest-discuss] RFC for REST? |url = http://tech.groups.yahoo.com/group/rest-discuss/message/6757 |archiveurl = https://web.archive.org/web/20091111012314/http://tech.groups.yahoo.com/group/rest-discuss/message/6757 |archivedate = 2009-11-11 }}</ref>. |
Стиль «REST» развивался параллельно с «[[HTTP 1.1]]», разработанным в 1996—1999 годах, основываясь на существующем дизайне «[[HTTP]] 1.0», разработанном в [[1996 год]]у<ref>{{Cite web|accessdate = 2015-12-01 |date = 2009-11-11 |title = rest-discuss : Message: Re: [rest-discuss] RFC for REST? |url = http://tech.groups.yahoo.com/group/rest-discuss/message/6757 |archiveurl = https://web.archive.org/web/20091111012314/http://tech.groups.yahoo.com/group/rest-discuss/message/6757 |archivedate = 2009-11-11 }}</ref>. |
||
== Свойства |
== Свойства архитектуры REST == |
||
Свойства архитектуры, которые зависят от ограничений, наложенных на REST-системы: |
Свойства архитектуры, которые зависят от ограничений, наложенных на REST-системы: |
||
* Производительность |
* Производительность: взаимодействие компонентов системы может являться доминирующим фактором производительности и эффективности сети с точки зрения пользователя; |
||
* Масштабируемость для обеспечения большого числа компонентов и взаимодействий компонентов. |
* Масштабируемость для обеспечения большого числа компонентов и взаимодействий компонентов. |
||
Рой Филдинг |
Рой Филдинг (один из главных авторов спецификации протокола HTTP) описывает влияние архитектуры REST на масштабируемость следующим образом: |
||
* Простота унифицированного интерфейса; |
* Простота унифицированного интерфейса; |
||
* Открытость компонентов к возможным изменениям для удовлетворения изменяющихся потребностей (даже при работающем приложении); |
* Открытость компонентов к возможным изменениям для удовлетворения изменяющихся потребностей (даже при работающем приложении); |
||
* Прозрачность связей между компонентами системы для сервисных служб; |
* Прозрачность связей между компонентами системы для сервисных служб; |
||
* Переносимость компонентов системы |
* Переносимость компонентов системы путём перемещения программного кода вместе с данными; |
||
* Надёжность, выражающаяся в устойчивости к отказам на уровне системы при наличии отказов отдельных компонентов, соединений или данных.<ref name="Fielding-Ch5" /> |
* Надёжность, выражающаяся в устойчивости к отказам на уровне системы при наличии отказов отдельных компонентов, соединений или данных.<ref name="Fielding-Ch5" /> |
||
== Требования к архитектуре REST == |
== Требования к архитектуре REST == |
||
Существует ''' |
Существует '''пять''' обязательных<ref name="SOA with REST">{{книга |заглавие=SOA with REST |год=2013 |издательство=[[Prentice Hall]] |isbn=978-0-13-701251-0 |часть=5.1 |язык=und |автор=Thomas Erl, Benjamin Carlyle, Cesare Pautasso, Raj Balasubramanian |ответственный=Thomas Erl}}</ref><ref name="Richardson 2007">{{Citation|last1=Richardson|first1=Leonard|title=RESTful Web service|year=2007|publisher=O'Reilly Media|isbn=978-0-596-52926-0|url=https://books.google.com/books?id=XUaErakHsoAC|first2=Sam|last2=Ruby|accessdate=2011-01-18|quote=The main topic of this book is the web service architectures which can be considered RESTful: those which get a good score when judged on the criteria set forth in Roy Fielding's dissertation.}} {{Cite web |url=https://books.google.com/books?id=XUaErakHsoAC |title=Источник |access-date=2016-11-30 |archive-date=2012-02-19 |archive-url=https://web.archive.org/web/20120219072006/https://books.google.com/books?id=XUaErakHsoAC |deadlink=unfit }}</ref> ограничений для построения распределённых REST-приложений по [[Филдинг, Рой|Филдингу]]<ref name="Fielding-Ch5" /><ref name="SOAwithREST">{{книга|автор=Thomas Erl, Benjamin Carlyle, Cesare Pautasso, Raj Balasubramanian|часть=5.1|заглавие=SOA with REST|издательство=Prentice Hall|год=2013|isbn=978-0-13-701251-0}}</ref> и одно необязательное. |
||
Накладываемые ограничения определяют работу сервера в том, как он может обрабатывать и отвечать на запросы клиентов. Действуя в рамках этих ограничений, система приобретает такие желательные свойства как производительность, масштабируемость, простота, способность к изменениям, переносимость, отслеживаемость и надёжность. |
|||
Если сервис-приложение нарушает ''любое'' из этих ограничительных условий, данную систему нельзя считать REST-системой<ref name="Fielding-Ch5" />. |
Если сервис-приложение нарушает ''любое'' из этих ограничительных условий, данную систему нельзя считать REST-системой<ref name="Fielding-Ch5" />. |
||
Строка 37: | Строка 37: | ||
=== 2. Отсутствие состояния === |
=== 2. Отсутствие состояния === |
||
Протокол взаимодействия между клиентом и сервером требует соблюдения следующего условия: в период между запросами клиента никакая информация о ''состоянии'' клиента на сервере не хранится ([[Протокол без сохранения состояния|Stateless protocol]] или «протокол без сохранения состояния»). Все запросы от клиента должны быть составлены так, чтобы сервер получил всю необходимую информацию для выполнения запроса. ''Состояние'' сессии при этом сохраняется на стороне клиента<ref name="Fielding-Ch5"/>. Информация о состоянии сессии может быть передана сервером какому-либо другому сервису (например, в службу базы данных) для поддержания устойчивого состояния, например, на период установления аутентификации. Клиент инициирует отправку запросов, когда он готов (возникает необходимость) перейти в новое состояние. |
Протокол взаимодействия между клиентом и сервером требует соблюдения следующего условия: в период между запросами клиента никакая информация о ''состоянии'' ''клиента'' на сервере не хранится ([[Протокол без сохранения состояния|Stateless protocol]] или «протокол без сохранения состояния»). Все запросы от клиента должны быть составлены так, чтобы сервер получил всю необходимую информацию для выполнения запроса. ''Состояние'' ''сессии'' при этом сохраняется на стороне клиента<ref name="Fielding-Ch5"/>. Информация о состоянии сессии может быть передана сервером какому-либо другому сервису (например, в службу базы данных) для поддержания устойчивого состояния, например, на период установления аутентификации. Клиент инициирует отправку запросов, когда он готов (возникает необходимость) перейти в новое состояние. |
||
Во время обработки клиентских запросов считается, что клиент находится в ''переходном состоянии''. Каждое отдельное ''состояние'' приложения представлено связями, которые могут быть задействованы при следующем обращении клиента. |
Во время обработки клиентских запросов считается, что клиент находится в ''переходном состоянии''. Каждое отдельное ''состояние'' ''приложения'' представлено связями, которые могут быть задействованы при следующем обращении клиента. |
||
=== 3. Кэширование === |
=== 3. Кэширование === |
||
{{Нет источников в разделе|дата=2017-03-16}} |
{{Нет источников в разделе|дата=2017-03-16}} |
||
Как и во [[Всемирная паутина|Всемирной паутине]], клиенты, а также промежуточные узлы, могут выполнять [[кэширование]] ответов сервера. Ответы сервера, в свою очередь, должны иметь явное или неявное обозначение как кэшируемые или некэшируемые с целью предотвращения получения клиентами устаревших или неверных данных в ответ на последующие запросы. Правильное использование кэширования способно частично или полностью устранить некоторые клиент- |
Как и во [[Всемирная паутина|Всемирной паутине]], клиенты, а также промежуточные узлы, могут выполнять [[кэширование]] ответов сервера. Ответы сервера, в свою очередь, должны иметь явное или неявное обозначение как кэшируемые или некэшируемые с целью предотвращения получения клиентами устаревших или неверных данных в ответ на последующие запросы. Правильное использование кэширования способно частично или полностью устранить некоторые проблемы клиент-серверного взаимодействия, ещё больше повышая производительность и масштабируемость системы. |
||
=== 4. Единообразие интерфейса === |
=== 4. Единообразие интерфейса === |
||
Строка 60: | Строка 60: | ||
'''Гипермедиа как средство изменения состояния приложения ([[HATEOAS]])'''<br> |
'''Гипермедиа как средство изменения состояния приложения ([[HATEOAS]])'''<br> |
||
Клиенты изменяют состояние системы только через действия, которые динамически определены в гипермедиа на сервере (к примеру, [[Гиперссылка|гиперссылки]] в [[гипертекст]]е). Исключая простые точки входа в приложение, клиент не может предположить, что доступна какая-то операция над каким-то ресурсом, если не получил информацию об этом в предыдущих запросах к серверу. Не существует универсального формата для предоставления ссылок между ресурсами, Web Linking (RFC 5988 -> RFC 8288) и [https://tools.ietf.org/id/draft-kelly-json-hal-03.txt JSON Hypermedia API Language] являются двумя популярными форматами предоставления ссылок в REST HYPERMEDIA сервисах. |
Клиенты изменяют состояние системы только через действия, которые динамически определены в гипермедиа на сервере (к примеру, [[Гиперссылка|гиперссылки]] в [[гипертекст]]е). Исключая простые точки входа в приложение, клиент не может предположить, что доступна какая-то операция над каким-то ресурсом, если не получил информацию об этом в предыдущих запросах к серверу. Не существует универсального формата для предоставления ссылок между ресурсами, Web Linking (RFC 5988 -> RFC 8288) и [https://tools.ietf.org/id/draft-kelly-json-hal-03.txt JSON Hypermedia API Language] {{Wayback|url=https://tools.ietf.org/id/draft-kelly-json-hal-03.txt |date=20140627002807 }} являются двумя популярными форматами предоставления ссылок в REST HYPERMEDIA сервисах. |
||
=== 5. Слои === |
=== 5. Слои === |
||
Клиент обычно не способен точно определить, взаимодействует он напрямую с [[Сервер приложений|сервером]] или же с промежуточным узлом, в связи с иерархической структурой сетей (подразумевая, что такая структура образует [[Иерархия|слои]]). Применение промежуточных серверов способно повысить масштабируемость за счёт [[Балансировка нагрузки|балансировки нагрузки]] и распределённого [[Кэширование|кэширования]]. Промежуточные узлы также могут подчиняться [[Политика безопасности|политике безопасности]] с целью обеспечения [[Конфиденциальная информация|конфиденциальности информации]]<ref>{{Статья|автор=Hartley Brody|заглавие=How HTTPS Secures Connections: What Every Web Dev Should Know|ссылка=https://blog.hartleybrody.com/https-certificates/|язык=en|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=}}</ref>. |
Клиент обычно не способен точно определить, взаимодействует ли он напрямую с [[Сервер приложений|сервером]] или же с промежуточным узлом, в связи с иерархической структурой сетей (подразумевая, что такая структура образует [[Иерархия|слои]]). Применение промежуточных серверов способно повысить масштабируемость за счёт [[Балансировка нагрузки|балансировки нагрузки]] и распределённого [[Кэширование|кэширования]]. Промежуточные узлы также могут подчиняться [[Политика безопасности|политике безопасности]] с целью обеспечения [[Конфиденциальная информация|конфиденциальности информации]]<ref>{{Статья|автор=Hartley Brody|заглавие=How HTTPS Secures Connections: What Every Web Dev Should Know|ссылка=https://blog.hartleybrody.com/https-certificates/|язык=en|издание=|тип=|год=|месяц=|число=|том=|номер=|страницы=|issn=|archivedate=2015-12-24|archiveurl=https://web.archive.org/web/20151224052719/https://blog.hartleybrody.com/https-certificates/}}</ref>. |
||
=== 6. Код по требованию (необязательное ограничение) === |
=== 6. Код по требованию (необязательное ограничение) === |
||
{{Нет источников в разделе|дата=2017-03-16}} |
{{Нет источников в разделе|дата=2017-03-16}} |
||
REST может позволить расширить функциональность клиента за счёт загрузки кода с сервера в виде [[апплет]]ов или [[Сценарный язык| |
REST может позволить расширить функциональность клиента за счёт загрузки кода с сервера в виде [[апплет]]ов или [[Сценарный язык|скриптов]]. Филдинг утверждает, что дополнительное ограничение позволяет проектировать архитектуру, поддерживающую желаемую функциональность в общем случае, но, возможно, за исключением некоторых контекстов. |
||
== Преимущества == |
== Преимущества == |
||
Филдинг указывал, что приложения, не соответствующие приведённым условиям, не могут называться REST-приложениями. Если же все условия соблюдены, то, по его мнению, приложение получит следующие преимущества<ref name="Fielding-Ch5"/><ref name="SOAwithREST" />: |
[[Филдинг, Рой|Рой Филдинг]] указывал, что приложения, не соответствующие приведённым условиям, не могут называться REST-приложениями. Если же все условия соблюдены, то, по его мнению, приложение получит следующие преимущества<ref name="Fielding-Ch5"/><ref name="SOAwithREST" />: |
||
* Надёжность (за счёт отсутствия необходимости сохранять информацию о состоянии клиента, которая может быть утеряна); |
* Надёжность (за счёт отсутствия необходимости сохранять информацию о состоянии клиента, которая может быть утеряна); |
||
* Производительность (за счёт использования кэша); |
* Производительность (за счёт использования кэша); |
||
Строка 98: | Строка 98: | ||
* {{cite web|url=http://www.jopera.org/docs/publications/2008/restws |title=RESTful Web Services vs. Big Web Services: Making the Right Architectural Decision |author=Cesare Pautasso |coauthors=Olaf Zimmerman; Frank Leymann |publisher=17th International World Wide Web Conference (WWW2008) |accessdate=2009-02-20 |lang=en |archiveurl=https://www.webcitation.org/67gOxPVRw?url=http://www.jopera.org/docs/publications/2008/restws |archivedate=2012-05-15 }} |
* {{cite web|url=http://www.jopera.org/docs/publications/2008/restws |title=RESTful Web Services vs. Big Web Services: Making the Right Architectural Decision |author=Cesare Pautasso |coauthors=Olaf Zimmerman; Frank Leymann |publisher=17th International World Wide Web Conference (WWW2008) |accessdate=2009-02-20 |lang=en |archiveurl=https://www.webcitation.org/67gOxPVRw?url=http://www.jopera.org/docs/publications/2008/restws |archivedate=2012-05-15 }} |
||
* {{cite web|url=http://msdn.microsoft.com/ru-ru/magazine/dd315413.aspx |title=Введение в службы RESTful с использованием WCF |author=Джон Фландерс |publisher=MSDN Magazine |accessdate=2009-02-20 |date=2009-01 |archiveurl=https://www.webcitation.org/67gOy2qOM?url=http://msdn.microsoft.com/ru-ru/magazine/dd315413.aspx |archivedate=2012-05-15 }} |
* {{cite web|url=http://msdn.microsoft.com/ru-ru/magazine/dd315413.aspx |title=Введение в службы RESTful с использованием WCF |author=Джон Фландерс |publisher=MSDN Magazine |accessdate=2009-02-20 |date=2009-01 |archiveurl=https://www.webcitation.org/67gOy2qOM?url=http://msdn.microsoft.com/ru-ru/magazine/dd315413.aspx |archivedate=2012-05-15 }} |
||
* {{cite web|url=http://www.ibm.com/developerworks/library/ws-restful/|title=RESTful Web services: The basics|author=Alex Rodriguez|accessdate=2015-12-15|lang=en|publisher=IBM}} |
* {{cite web|url=http://www.ibm.com/developerworks/library/ws-restful/|title=RESTful Web services: The basics|author=Alex Rodriguez|accessdate=2015-12-15|lang=en|publisher=IBM|archive-date=2015-12-22|archive-url=https://web.archive.org/web/20151222150557/http://www.ibm.com/developerworks/library/ws-restful/|deadlink=no}} |
||
* {{cite web|url=http://www.restapitutorial.com/|title=REST API Tutorial|author=Todd Fredrich|accessdate=2016-10-27|lang=en}} |
* {{cite web|url=http://www.restapitutorial.com/|title=REST API Tutorial|author=Todd Fredrich|accessdate=2016-10-27|lang=en|archive-date=2017-02-25|archive-url=https://web.archive.org/web/20170225065615/http://www.restapitutorial.com/|deadlink=no}} |
||
{{Внешние ссылки}} |
{{Внешние ссылки}} |
Текущая версия от 14:18, 7 февраля 2024
REST (от англ. REpresentational State Transfer — «передача репрезентативного состояния» или «передача „самоописываемого“ состояния») — архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Другими словами, REST — это набор правил того, как программисту организовать написание кода серверного приложения, чтобы все системы легко обменивались данными и приложение можно было масштабировать[1]. REST представляет собой согласованный набор ограничений, учитываемых при проектировании распределённой гипермедиа-системы. В определённых случаях (интернет-магазины, поисковые системы; прочие системы, основанные на данных) это приводит к повышению производительности и упрощению архитектуры. В широком смысле[уточнить] компоненты в REST взаимодействуют наподобие взаимодействия клиентов и серверов во Всемирной паутине. REST является альтернативой RPC[2].
В интернете вызов удалённой процедуры может представлять собой обычный HTTP-запрос (обычно GET или POST; такой запрос называют «REST-запрос»), а необходимые данные передаются в качестве параметров запроса[3][4].
Для веб-служб, построенных с учётом REST (то есть не нарушающих накладываемых им ограничений), применяют термин «RESTful».
В отличие от веб-сервисов (веб-служб) на основе SOAP, не существует «официального» стандарта для RESTful веб-API. Дело в том, что REST является архитектурным стилем, в то время как SOAP является протоколом. Несмотря на то, что REST не является стандартом сам по себе, большинство RESTful-реализаций используют такие стандарты, как HTTP, URL, JSON и, реже, XML.
История термина
[править | править код]Хотя данная концепция лежит в самой основе Всемирной паутины, термин «REST» был введён Роем Филдингом, одним из создателей протокола «HTTP», лишь в 2000 году[4]. В своей диссертации «Архитектурные стили и дизайн сетевых программных архитектур» («Architectural Styles and the Design of Network-based Software Architectures»)[5] в Калифорнийском университете в Ирвайне[3] он подвёл теоретическую основу под способ взаимодействия клиентов и серверов во Всемирной паутине, абстрагировав его и назвав «передачей представительного состояния» («Representational State Transfer»). Филдинг описал концепцию построения распределённого приложения, при которой каждый запрос (REST-запрос) клиента к серверу содержит в себе исчерпывающую информацию о желаемом ответе сервера (желаемом представительном состоянии), и сервер не обязан сохранять информацию о состоянии клиента («клиентской сессии»).
Стиль «REST» развивался параллельно с «HTTP 1.1», разработанным в 1996—1999 годах, основываясь на существующем дизайне «HTTP 1.0», разработанном в 1996 году[6].
Свойства архитектуры REST
[править | править код]Свойства архитектуры, которые зависят от ограничений, наложенных на REST-системы:
- Производительность: взаимодействие компонентов системы может являться доминирующим фактором производительности и эффективности сети с точки зрения пользователя;
- Масштабируемость для обеспечения большого числа компонентов и взаимодействий компонентов.
Рой Филдинг (один из главных авторов спецификации протокола HTTP) описывает влияние архитектуры REST на масштабируемость следующим образом:
- Простота унифицированного интерфейса;
- Открытость компонентов к возможным изменениям для удовлетворения изменяющихся потребностей (даже при работающем приложении);
- Прозрачность связей между компонентами системы для сервисных служб;
- Переносимость компонентов системы путём перемещения программного кода вместе с данными;
- Надёжность, выражающаяся в устойчивости к отказам на уровне системы при наличии отказов отдельных компонентов, соединений или данных.[3]
Требования к архитектуре REST
[править | править код]Существует пять обязательных[7][8] ограничений для построения распределённых REST-приложений по Филдингу[3][9] и одно необязательное.
Накладываемые ограничения определяют работу сервера в том, как он может обрабатывать и отвечать на запросы клиентов. Действуя в рамках этих ограничений, система приобретает такие желательные свойства как производительность, масштабируемость, простота, способность к изменениям, переносимость, отслеживаемость и надёжность.
Если сервис-приложение нарушает любое из этих ограничительных условий, данную систему нельзя считать REST-системой[3].
Обязательными условиями-ограничениями являются:
1. Модель клиент-сервер
[править | править код]Первым ограничением, применимым к гибридной модели, является приведение архитектуры к модели клиент-сервер. Разграничение потребностей является принципом, лежащим в основе данного накладываемого ограничения. Отделение потребности интерфейса клиента от потребностей сервера, хранящего данные, повышает переносимость кода клиентского интерфейса на другие платформы, а упрощение серверной части улучшает масштабируемость. Наибольшее же влияние на всемирную паутину, пожалуй, имеет само разграничение, которое позволяет отдельным частям развиваться независимо друг от друга, поддерживая потребности в развитии интернета со стороны различных организаций.[3]
2. Отсутствие состояния
[править | править код]Протокол взаимодействия между клиентом и сервером требует соблюдения следующего условия: в период между запросами клиента никакая информация о состоянии клиента на сервере не хранится (Stateless protocol или «протокол без сохранения состояния»). Все запросы от клиента должны быть составлены так, чтобы сервер получил всю необходимую информацию для выполнения запроса. Состояние сессии при этом сохраняется на стороне клиента[3]. Информация о состоянии сессии может быть передана сервером какому-либо другому сервису (например, в службу базы данных) для поддержания устойчивого состояния, например, на период установления аутентификации. Клиент инициирует отправку запросов, когда он готов (возникает необходимость) перейти в новое состояние.
Во время обработки клиентских запросов считается, что клиент находится в переходном состоянии. Каждое отдельное состояние приложения представлено связями, которые могут быть задействованы при следующем обращении клиента.
3. Кэширование
[править | править код]В разделе не хватает ссылок на источники (см. рекомендации по поиску). |
Как и во Всемирной паутине, клиенты, а также промежуточные узлы, могут выполнять кэширование ответов сервера. Ответы сервера, в свою очередь, должны иметь явное или неявное обозначение как кэшируемые или некэшируемые с целью предотвращения получения клиентами устаревших или неверных данных в ответ на последующие запросы. Правильное использование кэширования способно частично или полностью устранить некоторые проблемы клиент-серверного взаимодействия, ещё больше повышая производительность и масштабируемость системы.
4. Единообразие интерфейса
[править | править код]Наличие унифицированного интерфейса является фундаментальным требованием дизайна REST-сервисов[3]. Унифицированные интерфейсы позволяют каждому из сервисов развиваться независимо.
К унифицированным интерфейсам предъявляются следующие четыре ограничительных условия[10][11]:
Идентификация ресурсов
Все ресурсы идентифицируются в запросах, например, с использованием URI в интернет-системах. Ресурсы концептуально отделены от представлений, которые возвращаются клиентам. Например, сервер может отсылать данные из базы данных в виде HTML, XML или JSON, ни один из которых не является типом хранения внутри сервера.
Манипуляция ресурсами через представление
Если клиент хранит представление ресурса, включая метаданные — он обладает достаточной информацией для модификации или удаления ресурса.
«Самоописываемые» сообщения
Каждое сообщение содержит достаточно информации, чтобы понять, каким образом его обрабатывать. К примеру, обработчик сообщения (parser), необходимый для извлечения данных, может быть указан в списке MIME-типов[3].
Гипермедиа как средство изменения состояния приложения (HATEOAS)
Клиенты изменяют состояние системы только через действия, которые динамически определены в гипермедиа на сервере (к примеру, гиперссылки в гипертексте). Исключая простые точки входа в приложение, клиент не может предположить, что доступна какая-то операция над каким-то ресурсом, если не получил информацию об этом в предыдущих запросах к серверу. Не существует универсального формата для предоставления ссылок между ресурсами, Web Linking (RFC 5988 -> RFC 8288) и JSON Hypermedia API Language Архивная копия от 27 июня 2014 на Wayback Machine являются двумя популярными форматами предоставления ссылок в REST HYPERMEDIA сервисах.
5. Слои
[править | править код]Клиент обычно не способен точно определить, взаимодействует ли он напрямую с сервером или же с промежуточным узлом, в связи с иерархической структурой сетей (подразумевая, что такая структура образует слои). Применение промежуточных серверов способно повысить масштабируемость за счёт балансировки нагрузки и распределённого кэширования. Промежуточные узлы также могут подчиняться политике безопасности с целью обеспечения конфиденциальности информации[12].
6. Код по требованию (необязательное ограничение)
[править | править код]В разделе не хватает ссылок на источники (см. рекомендации по поиску). |
REST может позволить расширить функциональность клиента за счёт загрузки кода с сервера в виде апплетов или скриптов. Филдинг утверждает, что дополнительное ограничение позволяет проектировать архитектуру, поддерживающую желаемую функциональность в общем случае, но, возможно, за исключением некоторых контекстов.
Преимущества
[править | править код]Рой Филдинг указывал, что приложения, не соответствующие приведённым условиям, не могут называться REST-приложениями. Если же все условия соблюдены, то, по его мнению, приложение получит следующие преимущества[3][9]:
- Надёжность (за счёт отсутствия необходимости сохранять информацию о состоянии клиента, которая может быть утеряна);
- Производительность (за счёт использования кэша);
- Масштабируемость;
- Прозрачность системы взаимодействия (особенно необходимая для приложений обслуживания сети);
- Простота интерфейсов;
- Портативность компонентов;
- Лёгкость внесения изменений;
- Способность эволюционировать, приспосабливаясь к новым требованиям (на примере Всемирной паутины).
Примечания
[править | править код]- ↑ Что такое REST API . Дата обращения: 11 августа 2021. Архивировано 11 августа 2021 года.
- ↑ Машнин Тимур Сергеевич. Технология Web-сервисов платформы Java. — БХВ-Петербург, 2012. — С. 115. — 560 с. — ISBN 978-5-9775-0778-3.
- ↑ 1 2 3 4 5 6 7 8 9 10 Chapter 5 of Roy Fielding’s dissertation «Representational State Transfer (REST)» Архивная копия от 13 мая 2021 на Wayback Machine
- ↑ 1 2 Fielding discussing the definition of the REST term . Tech.groups.yahoo.com. Дата обращения: 28 ноября 2013. Архивировано 22 октября 2010 года.
- ↑ Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST) . www.ics.uci.edu. Дата обращения: 1 декабря 2015. Архивировано 13 мая 2021 года.
- ↑ rest-discuss : Message: Re: [rest-discuss] RFC for REST? (11 ноября 2009). Дата обращения: 1 декабря 2015. Архивировано 11 ноября 2009 года.
- ↑ Thomas Erl, Benjamin Carlyle, Cesare Pautasso, Raj Balasubramanian. 5.1 // SOA with REST (неопр.) / Thomas Erl. — Prentice Hall, 2013. — ISBN 978-0-13-701251-0.
- ↑ Richardson, Leonard; Ruby, Sam (2007), RESTful Web service, O'Reilly Media, ISBN 978-0-596-52926-0, Дата обращения: 18 января 2011,
The main topic of this book is the web service architectures which can be considered RESTful: those which get a good score when judged on the criteria set forth in Roy Fielding's dissertation.
Источник . Дата обращения: 30 ноября 2016. Архивировано 19 февраля 2012 года. - ↑ 1 2 Thomas Erl, Benjamin Carlyle, Cesare Pautasso, Raj Balasubramanian. 5.1 // SOA with REST. — Prentice Hall, 2013. — ISBN 978-0-13-701251-0.
- ↑ Wilde, Pautasso, 2011, REST Definition.
- ↑ Н. Л. Подколодный, А. В. Семенычев, Д. А. Рассказов, В. Г. Боровский, Е. А. Ананько, Е. В. Игнатьева, Н. Н. Подколодная, О. А. Подколодная, Н. А. Колчанов Распределённая система RESTful-web-сервисов для реконструкции и анализа генных сетей. Вавиловский журнал генетики и селекции, т. 16, N 4/1, 2012
- ↑ Hartley Brody. How HTTPS Secures Connections: What Every Web Dev Should Know (англ.). Архивировано 24 декабря 2015 года.
Литература
[править | править код]- Erik Wilde, Cesare Pautasso. REST: From Research to Practice. — Springer Science & Business Media, 2011. — 528 p. — ISBN 978-1-4419-8303-9.
Ссылки
[править | править код]- Roy Fielding. Architectural Styles and the Design of Network-based Software Architectures (англ.) (2000). Дата обращения: 20 февраля 2009. Архивировано 15 мая 2012 года.
- Cesare Pautasso; Olaf Zimmerman; Frank Leymann.: RESTful Web Services vs. Big Web Services: Making the Right Architectural Decision (англ.). 17th International World Wide Web Conference (WWW2008). Дата обращения: 20 февраля 2009. Архивировано 15 мая 2012 года.
- Джон Фландерс. Введение в службы RESTful с использованием WCF . MSDN Magazine (январь 2009). Дата обращения: 20 февраля 2009. Архивировано 15 мая 2012 года.
- Alex Rodriguez. RESTful Web services: The basics (англ.). IBM. Дата обращения: 15 декабря 2015. Архивировано 22 декабря 2015 года.
- Todd Fredrich. REST API Tutorial (англ.). Дата обращения: 27 октября 2016. Архивировано 25 февраля 2017 года.