Что такое RESTful-программирование? - PullRequest
3848 голосов
/ 22 марта 2009

Что такое RESTful-программирование?

Ответы [ 32 ]

38 голосов
/ 25 июля 2013

Что такое ОТДЫХ?

REST по официальным словам, REST - это архитектурный стиль, построенный на определенных принципах с использованием современных «веб-» основ. Существует 5 основных веб-принципов, которые используются для создания REST-сервисов.

  • Принцип 1: Все является ресурсом В архитектурном стиле REST данные и функциональные возможности считаются ресурсами и доступны с использованием универсальных идентификаторов ресурсов (URI), обычно ссылок в Интернете.
  • Принцип 2: Каждый ресурс идентифицируется уникальным идентификатором (URI)
  • Принцип 3: Используйте простые и унифицированные интерфейсы
  • Принцип 4: Общение осуществляется представлением
  • Принцип 5: не иметь гражданства
33 голосов
/ 22 марта 2009

Я вижу кучу ответов, в которых говорится, что помещать все о пользователе 123 в ресурс "/ user / 123" - RESTful.

Рой Филдинг, придумавший этот термин, говорит, что API REST должны управляться гипертекстом . В частности, «API REST не должен определять имена или иерархии фиксированных ресурсов».

Так что, если ваш путь "/ user / 123" жестко задан на клиенте, это не совсем RESTful. Хорошее использование HTTP, может быть, а может и нет. Но не RESTful. Это должно происходить из гипертекста.

26 голосов
/ 23 ноября 2013

Ответ очень прост, есть диссертация , написанная Роем Филдингом.] 1 В этой диссертации он определяет принципы REST. Если приложение удовлетворяет всем этим принципам, то это приложение REST.

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

REST-ограничения следующие:

  1. клиент-серверная архитектура

    Так что он не работает, например, с разъемами PUB / SUB, он основан на REQ / REP.

  2. связь без гражданства

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

  3. использование кэша, если вы можете

    Так что вам не нужно обслуживать одни и те же запросы снова и снова.

  4. единый интерфейс как общий контракт между клиентом и сервером

    Контракт между клиентом и сервером не поддерживается сервером. Другими словами, клиент должен быть отделен от реализации сервиса. Вы можете достичь этого состояния, используя стандартные решения, такие как стандарт IRI (URI) для идентификации ресурсов, стандарт HTTP для обмена сообщениями, стандартные типы MIME для описания формата сериализации тела, метаданные (возможно, RDF-слова, микроформаты и т. Д.) Для опишите семантику различных частей тела сообщения. Чтобы отделить структуру IRI от клиента, вы должны отправлять гиперссылки клиентам в гипермедиа форматах, таких как (HTML, JSON-LD, HAL и т. Д.). Таким образом, клиент может использовать метаданные (возможно, отношения ссылок, RDF-термины), назначенные гиперссылкам, чтобы перемещаться по конечному автомату приложения через надлежащие переходы состояний для достижения его текущей цели.

    Например, когда клиент хочет отправить заказ в интернет-магазин, он должен проверить гиперссылки в ответах, отправленных интернет-магазином. Проверяя ссылки, он находит ссылку, описанную с помощью http://schema.org/OrderAction.. Клиент знает вокабу schema.org, поэтому он понимает, что, активировав эту гиперссылку, он отправит заказ. Таким образом, он активирует гиперссылку и отправляет сообщение POST https://example.com/api/v1/order с соответствующим телом. После этого служба обрабатывает сообщение и отвечает с результатом, имеющим правильный заголовок статуса HTTP, например, 201 - created в случае успеха. Для аннотирования сообщений подробными метаданными используется стандартное решение для использования формата RDF, например JSON-LD с вокабом REST, например Hydra и специфичные для домена вокабы, такие как схема. org или любой другой связанный data vocab и, возможно, пользовательский Vocab для конкретного приложения, если это необходимо. Теперь это непросто, поэтому большинство пользователей используют HAL и другие простые форматы, которые обычно предоставляют только REST vocab, но не поддерживают связанные данные.

  5. создание многоуровневой системы для повышения масштабируемости

    Система REST состоит из иерархических слоев. Каждый уровень содержит компоненты, которые используют службы компонентов, которые находятся на следующем уровне ниже. Таким образом, вы можете добавлять новые слои и компоненты без особых усилий.

    Например, есть уровень клиента, который содержит клиентов, а ниже уровень сервиса, который содержит один сервис. Теперь вы можете добавить кеш на стороне клиента между ними. После этого вы можете добавить еще один экземпляр службы и балансировщик нагрузки и т. Д. Код клиента и код службы не изменятся.

  6. код по требованию для расширения функциональности клиента

    Это ограничение не является обязательным. Например, вы можете отправить парсер для определенного типа мультимедиа клиенту и т. Д. ... Для этого вам может понадобиться стандартная система загрузчика плагинов в клиенте, или ваш клиент будет подключен к решению загрузчика плагинов .

Ограничения REST приводят к очень масштабируемой системе, в которой клиенты не связаны с реализациями служб. Таким образом, клиенты могут быть повторно использованы, как и браузеры в Интернете. Клиенты и службы используют одни и те же стандарты и термины, поэтому они могут понимать друг друга, несмотря на то, что клиент не знает деталей реализации службы. Это позволяет создавать автоматизированных клиентов, которые могут находить и использовать службы REST для достижения своих целей. В долгосрочной перспективе эти клиенты могут общаться друг с другом и доверять друг другу задачи, как это делают люди. Если мы добавим шаблоны обучения для таких клиентов, то результатом будет один или несколько ИИ, использующих сеть машин вместо одного парка серверов. Итак, в конце мечта Бернерса Ли: семантическая паутина и искусственный интеллект станут реальностью. Таким образом, в 2030 году мы были в конечном итоге уничтожены Скайнетом. До тех пор ...; -)

21 голосов
/ 15 июня 2014

RESTful (передача состояния представления) API-программирование - это написание веб-приложений на любом языке программирования с использованием следующих 5 базовых программ архитектурный стиль принципы:

  1. Ресурс (данные, информация).
  2. Уникальный глобальный идентификатор (все ресурсы уникально идентифицируются по URI ).
  3. Единый интерфейс - используйте простой и стандартный интерфейс (HTTP).
  4. Представление - все общение осуществляется представлением (например, XML / JSON )
  5. Без сохранения состояния (каждый запрос выполняется в полной изоляции, кеширование и балансировка нагрузки проще),

Другими словами, вы пишете простые двухточечные сетевые приложения по HTTP, которые используют глаголы, такие как GET, POST, PUT или DELETE, путем реализации архитектуры RESTful, которая предлагает стандартизацию интерфейса, который предоставляет каждый «ресурс». Это ничто иное, как использование текущих возможностей Интернета простым и эффективным способом (очень успешная, проверенная и распределенная архитектура). Это альтернатива более сложным механизмам, таким как SOAP , CORBA и RPC .

Программирование RESTful соответствует дизайну веб-архитектуры и, при правильной реализации, позволяет в полной мере использовать возможности масштабируемой веб-инфраструктуры.

17 голосов
/ 02 февраля 2012

REST - это архитектурный паттерн и стиль написания распределенных приложений. Это не стиль программирования в узком смысле.

Сказать, что вы используете стиль REST, похоже на то, что вы построили дом в определенном стиле: например, в стиле Тюдор или в викторианском стиле. И REST как стиль программного обеспечения, и Tudor или Victorian как стиль дома могут быть определены качествами и ограничениями, которые их составляют. Например, REST должен иметь разделение Client Server, где сообщения имеют самоописание. Дома в стиле Тюдор имеют перекрывающие фронтоны и крыши, которые имеют крутой наклон фронтонов. Вы можете прочитать диссертацию Роя, чтобы узнать больше об ограничениях и качествах, которые составляют ОТДЫХ.

REST, в отличие от домашних стилей, испытывал трудности с последовательным и практическим применением. Это могло быть преднамеренным. Оставляя его актуальную реализацию до дизайнера. Таким образом, вы можете делать то, что хотите, если вы соответствуете ограничениям, изложенным в диссертации, которую вы создаете. REST Systems.

Бонус:

Вся сеть основана на REST (или REST была основана на сети). Поэтому, как веб-разработчик, вы можете знать об этом, хотя писать хорошие веб-приложения не обязательно.

17 голосов
/ 31 марта 2017

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

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

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

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

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

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

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

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

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

17 голосов
/ 01 февраля 2012

Если бы мне пришлось сократить первоначальную диссертацию по REST до 3 коротких предложений, я думаю, что следующее отражает ее суть:

  1. Ресурсы запрашиваются через URL.
  2. Протоколы ограничены тем, что вы можете общаться с помощью URL.
  3. Метаданные передаются в виде пар имя-значение (данные публикации и параметры строки запроса).

После этого легко начать дискуссию об адаптациях, соглашениях о кодировании и передовых практиках.

Интересно, что в диссертации нет упоминаний об операциях HTTP POST, GET, DELETE или PUT. Это должно быть чье-то позднее толкование «лучшей практики» для «унифицированного интерфейса».

Когда дело доходит до веб-сервисов, нам кажется, что нам нужен какой-то способ различения архитектур на основе WSDL и SOAP, которые добавляют значительные накладные расходы и, возможно, излишнюю сложность интерфейса. Они также требуют дополнительных структур и инструментов разработчика для реализации. Я не уверен, является ли REST лучшим термином для разграничения между интерфейсами здравого смысла и чрезмерно разработанными интерфейсами, такими как WSDL и SOAP. Но нам нужно что-то.

15 голосов
/ 03 июля 2014

Я думаю, что смысл restful - это разделение состояния на более высокий уровень при использовании Интернета (протокола) в качестве транспортного уровня без состояния . Большинство других подходов перемешивают.

Это был лучший практический подход, чтобы справиться с фундаментальными изменениями программирования в эпоху Интернета. Что касается фундаментальных изменений, Эрик Мейер обсуждает это здесь: http://www.infoq.com/interviews/erik-meijer-programming-language-design-effects-purity#view_93197. Он суммирует его как пять эффектов и представляет решение, разработав решение на языке программирования. Решение также может быть достигнуто на уровне платформы или системы, независимо от языка. Отдых может рассматриваться как одно из решений, которое было очень успешным в современной практике.

С спокойным стилем вы получаете и управляете состоянием приложения через ненадежный интернет. Если текущая операция не может получить правильное и текущее состояние, ей нужен принцип нулевой проверки, чтобы приложение могло продолжить работу. Если он не может манипулировать состоянием, он обычно использует несколько этапов подтверждения, чтобы все было правильно. В этом смысле отдых сам по себе не является целым решением, ему нужны функции в другой части стека веб-приложений для поддержки его работы.

Учитывая эту точку зрения, стиль отдыха на самом деле не привязан к интернету или веб-приложению. Это фундаментальное решение для многих ситуаций программирования. Это также не просто, это просто делает интерфейс действительно простым и удивительно хорошо справляется с другими технологиями.

Просто мой 2с.

Редактировать: еще два важных аспекта:

14 голосов
/ 13 января 2017

Это удивительно долгая «дискуссия», и все же довольно запутанная, если не сказать больше.

IMO:

1) Нет такой вещи, как спокойное программирование, без большого сустава и большого количества пива:)

2) Представительный государственный перевод (REST) ​​- это архитектурный стиль, определенный в диссертации Роя Филдинга . Это имеет ряд ограничений. Если ваша Служба / Клиент уважает их, тогда это RESTful. Вот и все.

Вы можете суммировать (значительно) ограничения для:

  • связь без гражданства
  • соблюдать спецификации HTTP (если используется HTTP)
  • четко передает передаваемые форматы контента
  • использовать гипермедиа в качестве движка состояния приложения

Есть еще один очень хороший пост , который хорошо объясняет.

Многие ответы копируют / вставляют достоверную информацию, смешивая ее и добавляя некоторую путаницу. Здесь люди говорят об уровнях, об RESTFul URI (нет такого!), Применяют HTTP-методы GET, POST, PUT ... REST не об этом или не только об этом.

Например, ссылки - приятно иметь красиво выглядящий API, но в конце клиент / сервер на самом деле не заботится о ссылках, которые вы получаете / отправляете, - это контент, который имеет значение.

В конце любой клиент RESTful должен иметь возможность использовать любой сервис RESTful, если известен формат контента.

12 голосов
/ 30 ноября 2016

Старый вопрос, новый способ ответа. Есть много заблуждений об этой концепции. Я всегда стараюсь запомнить:

  1. Структурированные URL-адреса и методы / глаголы Http не являются определением спокойное программирование.
  2. JSON - это не спокойное программирование
  3. RESTful программирование не для API

Я определяю спокойное программирование как

Приложение успокаивается, если оно предоставляет ресурсы (являющиеся комбинацией элементов управления данными + переходы состояний) в типе носителя, который понимает клиент

Чтобы быть спокойным программистом, вы должны пытаться создавать приложения, позволяющие актерам что-то делать. Не только разоблачение базы данных.

Элементы управления переходом между состояниями имеют смысл только в том случае, если клиент и сервер договариваются о представлении ресурса по типу носителя. В противном случае нет способа узнать, что такое элемент управления, а что нет, и как выполнить элемент управления. То есть, если браузеры не знают теги <form> в html, вам нечего будет отправлять в переходное состояние в вашем браузере.

Я не стремлюсь к саморекламе, но в своих выступлениях я углубляюсь в эти идеи http://techblog.bodybuilding.com/2016/01/video-what-is-restful-200.html.

Выдержка из моего выступления о часто упоминаемой модели зрелости Ричардсона. Я не верю в уровни, вы либо ОТДЫХАЛИ (уровень 3), либо нет, но я хотел бы сказать об этом: что каждый уровень делает для вас на пути к RESTful

annotated richardson maturity model

...