В чем преимущество использования REST вместо не-REST HTTP?


Ответы:


163

Я не думаю , что вы получите хороший ответ на это, отчасти потому , что на самом деле никто не соглашается на то , что REST является . На странице Википедии много модных слов и мало объяснений. Страница обсуждения стоит посмотреть, чтобы увидеть, насколько люди не согласны с этим. Однако, насколько я могу судить, REST означает это:

Вместо того , чтобы случайно именованный-акцессоры URL - адрес и использования GETдля всех добытчиков и POSTдля всех сеттеров, мы стараемся , чтобы эти URL - адрес определить ресурсы, а затем с помощью HTTP - действий GET, POST, PUTи DELETEделать вещи для них. Так что вместо

GET /get_article?id=1
POST /delete_article   id=1

Вы бы сделали

GET /articles/1/
DELETE /articles/1/

А затем POSTи PUTсоответствуют операциям «создать» и «обновить» (но никто не согласен, в какую сторону).

Я думаю , что аргументы кэширования являются неправильными, поскольку строки запроса являются обычно кэшируются, и к тому же вы на самом деле не нужно использовать их. Например, django делает что-то вроде этого очень простым, и я бы не сказал, что это REST:

GET /get_article/1/
POST /delete_article/     id=1

Или даже просто включите глагол в URL:

GET /read/article/1/
POST /delete/article/1/
POST /update/article/1/
POST /create/article/

В этом случае GETозначает что-то без побочных эффектов, и POSTозначает что-то, что изменяет данные на сервере. Я думаю, что это, возможно, немного яснее и проще, тем более, что вы можете избежать всего PUTэтого POST. Кроме того, вы можете добавить больше глаголов, если хотите, чтобы вы не были искусственно связаны с тем, что предлагает HTTP. Например:

POST /hide/article/1/
POST /show/article/1/

(Или что-то еще, трудно думать о примерах, пока они не произойдут!)

Итак, в заключение я вижу только два преимущества:

  1. Ваш веб-API может быть чище и проще для понимания / обнаружения.
  2. При синхронизации данных с веб-сайтом, вероятно, проще использовать REST, потому что вы можете просто сказать synchronize("/articles/1/")или что-то еще. Это сильно зависит от вашего кода.

Однако я думаю, что есть некоторые довольно большие недостатки:

  1. Не все действия легко отображаются в CRUD (создание, чтение / получение, обновление, удаление). Вы можете даже не иметь дело с ресурсами типа объекта.
  2. Это дополнительные усилия для сомнительных выгод.
  3. Путаница относительно того, какой путь PUTи где POST. На английском языке они означают похожие вещи («Я собираюсь разместить / разместить объявление на стене»).

Итак, в заключение я бы сказал: если вы действительно не хотите идти на дополнительные усилия или если ваш сервис очень хорошо соответствует операциям CRUD, сохраните REST для второй версии вашего API.


Я только что натолкнулся на другую проблему с REST: нелегко сделать более одной вещи в одном запросе или указать, какие части составного объекта вы хотите получить. Это особенно важно на мобильных устройствах, где время прохождения сигнала в оба конца может быть значительным, а соединения ненадежными. Например, предположим, что вы получаете сообщения на временной шкале Facebook. «Чистый» способ REST был бы чем-то вроде

GET /timeline_posts     // Returns a list of post IDs.
GET /timeline_posts/1/  // Returns a list of message IDs in the post.
GET /timeline_posts/2/
GET /timeline_posts/3/
GET /message/10/
GET /message/11/
....

Что смешно. API Facebook очень хорош для IMO, так что давайте посмотрим, что они делают:

По умолчанию большинство свойств объекта возвращаются при выполнении запроса. Вы можете выбрать поля (или соединения), которые хотите вернуть, с помощью параметра запроса «fields». Например, этот URL будет возвращать только идентификатор, имя и изображение Бена: https://graph.facebook.com/bgolub?fields=id,name,picture

Я понятия не имею, как бы вы сделали что-то подобное с REST, и если бы вы сделали, будет ли это все равно считаться REST. Я бы, конечно, проигнорировал любого, кто пытается сказать вам, что вы не должны этого делать (особенно, если причина в том, что «это не ОТДЫХ»)!


4
POST и PUT предназначены для использования в HTTP RFC. В этом случае PUT означает создание / обновление чего-либо в определенном месте - что происходит, зависит от того, есть ли что-то уже в URI (и оно также идемпотентно), в то время как POST означает, что вы просите веб-службу определить, куда поместить то, что вы отправив его, а затем он возвращает вам URI (так что это только создать). Не могу жаловаться на английский, не тогда, когда он полностью отключен, чтобы использовать DELETE, когда ссылается на что-то с компьютера. Мне интересно, что делать с вопросом, поднятым в вашей редакции: P
Nan L

7
Пример Facebook API выглядит для меня как REST (на самом деле гораздо больше, так что ваши примеры используют глаголы в URL). Нет причин, по которым параметры запроса не могут быть RESTful, это просто хорошая практика использовать пути, где данные могут быть упорядочены в иерархии.
Джастин Эмери

5
Строки запроса идеально подходят для RESTful, если в них нет ссылок на ресурсы. Я склонен думать о них больше как о фильтрах, которые могут настроить поведение конечной точки.
Синастетический

3
-1, REST - это что-то очень специфическое - как это описал Рой Филдинг, когда он это придумал. Смотрите этот ответ . в частности: «Клиенту нужно знать только начальный URI и впоследствии выбирать из предоставленных сервером вариантов навигации или выполнения действий». , По сути, если какая-либо часть конечных точек API-документов, например, говорит «с заданным идентификатором пользователя, вы можете получить информацию о пользователе /user/{id}, тогда это не успокаивает. Подумайте: должен ли ваш браузер быть предварительно запрограммированным, зная, как получить HTML для вопроса stackoverflow» страница?
Клавдиу

1
(продолжение ...) То, что другие люди неправильно используют этот термин, не меняет его. Отказ от ответственности, хотя: я все еще только изучаю, что такое REST, и это то, что щелкнуло для меня недавно.
Клаудиу

47

Проще говоря, REST означает использование HTTP таким, каким оно должно быть.

Взгляните на диссертацию Роя Филдинга о REST . Я думаю, что каждый, кто занимается веб-разработкой, должен это прочитать.

Как примечание, Рой Филдинг также является одним из ключевых драйверов протокола HTTP.

Чтобы назвать некоторые из преимуществ:

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

11
«Простой»: почему REST проще, чем HTTP?
Дмитрий С.

5
«помогает вам организовать». То есть эта организация сложнее, если использовать только GET и POST?
Дмитрий С.

1
«Это позволяет новым клиентам легко использовать ваше приложение»: речь идет о REST против простого HTTP, верно?
Дмитрий С.

23
Соответствовать ограничениям REST определенно не просто. Сложно сложить бизнес-операции в четыре стандартных глагола иногда бывает очень сложно. Тем не менее, если все сделано хорошо, конечный результат может быть легко понять, но получить что-то, кроме.
Даррел Миллер

6
@Dimitri: «Простой», потому что он дает вам простую структуру для работы. ОТДЫХ - это HTTP! Это намного проще, чем SOAP (который даже имеет простое название). «Помогает вам организовать» - концепция не очень сложна для понимания и, будучи правильно реализованной, делает все очень хорошо. REST может быть как способ проектирования приложения, а не как деталь реализации. Как подчеркивает Даррел, это может быть нелегко, но результат приносит пользу. «Это позволяет новым клиентам легко использовать ваше приложение» - опять же: REST - это HTTP.
Эмиль Иванов

32

Проще говоря: НЕТ .

Не стесняйтесь понижать голос, но я все еще думаю, что нет никаких реальных преимуществ по сравнению с HTTP без REST. Все текущие ответы недействительны. Аргументы из наиболее популярных на данный момент ответов:

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

1. Простой

С REST вам необходим дополнительный уровень связи для сценариев на стороне сервера и на стороне клиента => на самом деле это сложнее, чем использование HTTP без REST.

2. Кеширование

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

3. Организация

ОТДЫХ не помогает вам организовать вещи. Это заставляет вас использовать API, поддерживаемый используемой вами серверной библиотекой. Вы можете организовать свое приложение таким же образом (или лучше), когда используете подход без REST. Например, см. Model-View-Controller или MVC .

4. Простота в использовании / реализации

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


3
как правило, остальные API легче кэшировать, потому что вы разделяете данные на ресурсы с одинаковым жизненным циклом (создаются и обновляются одновременно), так что вы можете надежно кэшировать и кэшировать данные, в то время как non -rest-apis часто возвращает данные, которые имеют был сильно постобработан или представляет собой конгломерат из нескольких сущностей, затрудняющий кеширование
Скотт Шультесс

2
Правильно, это не взаимоисключающий (вы можете иметь не-отдыхающий API, который кешируется), но подход к дизайну API, основанный на отдыхе, поощряет, и на практике это определенно актуально, поскольку он поощряет различные лучшие практики (обнаружение, универсальные интерфейсы, кэшируемость, интеллектуальное моделирование ресурсов). )
Скотт Шультесс

4
«REST не помогает вам организовать вещи. Он заставляет вас использовать API, поддерживаемый используемой вами серверной библиотекой». Я не уверен, что вы подразумеваете под этим. Совершенно возможно (и не более сложно, чем создание не-REST API) создать RESTful API без использования дополнительной серверной инфраструктуры.
Майкл О.

2
«С REST вам нужен дополнительный коммуникационный уровень», - вы, придурок, можете прекрасно использовать вашу существующую библиотеку HTTP.
Сёрен Буазен

1
@ SørenBoisen Этот ответ немного староват. Я, вероятно, должен обновить его, чтобы больше отражать текущее состояние вещей.
Петр Пеллер

23

ИМХО самое большое преимущество, которое дает REST, - это уменьшение связи клиент / сервер. Гораздо проще развивать интерфейс REST с течением времени, не нарушая существующих клиентов.


4
Не могли бы вы привести пример? Спасибо!
Ян Янковский

3
Не будет ли это зависеть от того, насколько отвратительным был ваш не REST API?
Джонни

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

@DarrelMiller Не могли бы вы пояснить, как REST снижает связь между клиентом и сервером лучше, чем HTTP-подход без REST? Я полагаю, что вы указываете на то, что сказал Тимммм в своем ответе. Пожалуйста, смотрите мой последний комментарий под ответом
Timmmm

Системы @emilly REST не используют внешнюю информацию для обработки ответа. Нет никаких предположений о том, что может вернуться из конкретного запроса. Ответ расскажет вам все, что вам нужно знать. Это позволяет серверу изменять свое поведение, и клиент может знать об этих изменениях.
Даррел Миллер

15

Понятность

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

Совместимость с другими инструментами

Вы можете CURL свой путь в любой части API или использовать веб-браузер для навигации по ресурсам. Упрощает интеграцию отладки и тестирования.

Стандартизированные имена глаголов

Позволяет указывать действия без необходимости искать правильную формулировку. Представьте себе, если ООП геттеры и сеттеры не были стандартизированы, и некоторые люди использовали retrieveи defineвместо этого. Вам нужно будет запомнить правильный глагол для каждой отдельной точки доступа. Знание, что есть только горстка доступных глаголов, решает эту проблему.

Стандартизированный статус

Если ваш GETресурс не существует, вы можете быть уверены, что получите 404ошибку в RESTful API. Сравните это с не-RESTful API, который может вернуться, {error: "Not found"}завернутый в Бог знает, сколько слоев. Если вам нужно дополнительное место, чтобы написать сообщение разработчику на другой стороне, вы всегда можете использовать тело ответа.

пример

Представьте себе два API с одинаковой функциональностью, один после REST, а другой нет. Теперь представьте следующие клиенты для этих API:

RESTful:

GET /products/1052/reviews
POST /products/1052/reviews       "5 stars"
DELETE /products/1052/reviews/10
GET /products/1052/reviews/10

HTTP:

GET /reviews?product_id=1052
POST /post_review?product_id=1052                  "5 stars"
POST /remove_review?product_id=1052&review_id=10
GET /reviews?product_id=1052&review=10

Теперь подумайте над следующими вопросами:

  • Если первый звонок каждого клиента сработал, насколько вы можете быть уверены, что остальные тоже сработают?

  • Произошло серьезное обновление API, которое могло или не могло изменить эти точки доступа. Сколько документов вы должны будете перечитать?

  • Можете ли вы предсказать возвращение последнего запроса?

  • Вы должны отредактировать опубликованный отзыв (перед его удалением). Вы можете сделать это без проверки документов?


Этот список не является исчерпывающим и содержит только очень практические преимущества.
BoppreH

Это очень умный ответ, я аплодирую.
EralpB

10

Я рекомендую взглянуть на книгу Райана Томайко « Как я объяснил REST моей жене»

Стороннее редактирование

Выдержка из ссылки на waybackmaschine:

Как насчет примера. Вы учитель и хотите управлять учениками:

  • в каких классах они учатся,
  • какие оценки они получают,
  • аварийные контакты,
  • информация о книгах, из которых вы учите, и т. д

Если системы веб-интерфейсом, то есть, вероятно, URL для каждого из имен , участвующих здесь: student, teacher, class, book, room, etc. ... Если бы для каждого URL существовало машиночитаемое представление, то было бы тривиально привязать новые инструменты к системе, потому что вся эта информация была бы потребляемой стандартным способом. ... вы могли бы создать общенациональную систему, которая могла бы общаться с каждой из отдельных школьных систем для сбора результатов тестирования.

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


6
Жена: Это еще один робот?
Тобу

4
Это хороший текст, но он не дал никаких примеров того, почему было бы плохо использовать GET и POST для всего.
Дмитрий С.

9
Вот почему я пытаюсь понять, почему это лучше :-)
Dimitri C.

7
Письмо было снято.
Surfen


5

Я бы предложил всем, кто ищет ответ на этот вопрос, пройти это «слайд-шоу» .

Я не мог понять, что такое REST и почему он такой крутой, его плюсы и минусы, отличия от SOAP - но это слайд-шоу было настолько блестящим и простым для понимания, что теперь мне гораздо понятнее, чем раньше.


3

Кэширование.

Есть и другие, более глубокие преимущества REST, которые вращаются вокруг способности эволюции через слабую связь и гипертекст, но механизмы кэширования являются основной причиной, по которой вам следует заботиться о RESTful HTTP.


3
Можете ли вы привести пример того, что может быть кэшировано и почему кэширование не будет происходить с решением без REST?
Дмитрий С.

2
@Dimitri C .: прокси не может кэшировать ссылку wikipedia.org/article?id=19 , так как она игнорирует параметры, переданные в URL. С другой стороны, ссылка wikipedia.org/REST будет кэширована, понятно?
VP.

6
Если бы кэширование было основным преимуществом REST, я могу заверить вас, что я не потратил бы последние два года на создание сервисов RESTful.
Даррел Миллер

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

1
Так почему бы просто не использовать GET /get_article/19/и POST /update_articleесли кеширование является вашей заботой. Вы все еще можете сделать все , что только с GETи POSTи я считаю , RESTозначает «использование GET, POST, PUTи DELETEтолько.» а не просто «Не использовать строки запроса». так что я не предложил REST. С другой стороны , никто не может на самом деле согласен , что REST это так , я помещаю его в ведре с «Web 2.0».
Тимммм

3

Это записано в диссертации Филдинга . Но если вы не хотите много читать:

  • повышенная масштабируемость (из-за ограничений по состоянию, кешу и многослойности системы)
  • разъединены клиент и сервер (из-за отсутствия состояния и единообразных ограничений интерфейса)
    • повторно используемые клиенты (клиент может использовать общие REST-браузеры и семантику RDF, чтобы решить, по какой ссылке следовать и как отображать результаты)
    • неразрывные клиенты (клиенты ломаются только из-за изменений семантики конкретного приложения, потому что они используют семантику вместо некоторых специфических знаний API)

0
  • Дайте каждому «ресурсу» идентификатор
  • Связать вещи вместе
  • Используйте стандартные методы
  • Ресурсы с несколькими представлениями
  • Общаться без гражданства

Можно все сделать только с помощью POST и GET? Да, это лучший подход? Нет почему? потому что у нас есть стандартные методы. Если вы подумаете еще раз, можно было бы сделать все, используя только GET ... так почему же нам вообще стоит использовать POST? Из-за стандартов!

Например, сегодня, думая о модели MVC, вы можете ограничить свое приложение, чтобы оно отвечало только на определенные виды глаголов, такие как POST, GET, PUT и DELETE. Даже если под капотом все эмулируется в POST и GET, не имеет ли смысла иметь разные глаголы для разных действий?


1
«можно было бы сделать все, используя только GET»: я уже провел несколько экспериментов с HTTP GET в Silverlight. Мой вывод состоял в том, что сообщения GET значительно ограничены по размеру, тогда как сообщения POST могут быть больше (опять же: в настройке Silverlight). Поэтому я бы решил использовать HTTP POST для всего! :-)
Дмитрий С.

оба решения противоречат стандартам. Делать все через POST не очень хорошо, особенно для запросов. Обратите внимание, что в последние годы все поисковые системы, которые раньше работали как GET, теперь работают как GET. Зачем? потому что метод «get» обладает такой способностью стать паучком ...
VP.

0

Открытие гораздо проще в REST. У нас есть документы WADL (аналогично WSDL в традиционных веб-сервисах), которые помогут вам рекламировать ваш сервис в мире. Вы также можете использовать открытия UDDI. При использовании традиционных HTTP POST и GET люди могут не знать схемы вашего запроса и ответа на ваш звонок.


1
Описание веб-службы RESTful с помощью документа WADL сводит на нет одно из главных преимуществ REST, в частности, все преимущества, полученные от гипермедиа.
Томас Эйзингер

@ThomasEizinger WADL действительно такая плохая вещь? В настоящее время мы работаем с другой компанией, которая не предоставляет WADL сверху, она возвращает json-объекты в зависимости от того, что содержится в нашем запросе. Я предполагаю, что WADL будет полезно прояснить, придумывает.
заниматься серфингом

WADL отлично справляется с описанием HTTP API, потому что именно для этого он и был разработан. В зависимости от услуг, предоставляемых этой компанией, WADL может быть или не быть хорошей идеей. Если служба не использует преимущества гипермедиа и просто сериализует некоторые объекты в JSON, они также должны предоставить документацию (WADL, Swagger и т. Д.) О том, как работает их служба и что она ожидает / возвращает. WADL сам по себе совсем не плох, он просто не подходит для (действительно) RESTful веб-сервиса.
Томас Эйзингер

0

Одним из преимуществ является то, что мы можем обрабатывать XML-документы и демаршировать XML-данные из разных источников, таких как объект InputStream, URL-адрес, DOM-узел ...


0

@Timmmm, о вашем редактировании:

GET /timeline_posts     // could return the N first posts, with links to fetch the next/previous N posts

Это резко сократило бы количество звонков

И ничто не мешает вам разработать сервер, который принимает параметры HTTP для обозначения значений полей, которые могут понадобиться вашим клиентам ...

Но это деталь.

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

Что касается вашего замечания

«Не все действия легко сопоставляются с CRUD (создание, чтение / получение, обновление, удаление)».

СУБД также использует подход CRUD (SELECT / INSERT / DELETE / UPDATE), и всегда есть способ представить модель данных и воздействовать на нее.

Относительно вашего предложения

«Возможно, вы даже не имеете дело с ресурсами типа объекта»

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


-1

Поисковые системы могут игнорировать строки запроса.


8
Использование строки запроса полностью RESTful.
Эмиль Иванов

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

3
... что просто неверно, когда вы упоминаете Google: googlewebmastercentral.blogspot.com/2008/09/…
Boldewyn

-1 для строк запроса не игнорируется поисковыми системами. webmasters.googleblog.com/2008/09/…
бронзовый человечек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.