В чем преимущество использования REST вместо не-REST HTTP? - PullRequest
152 голосов
/ 03 февраля 2010

Очевидно, REST - это просто набор соглашений о том, как использовать HTTP . Интересно, какое преимущество дают эти соглашения? Кто-нибудь знает?

Ответы [ 14 ]

152 голосов
/ 23 октября 2012

Не думаю, что вы получите хороший ответ на этот вопрос, отчасти потому, что на самом деле никто не согласен с тем, что такое 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 -vs- 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. Я бы, конечно, проигнорировал любого, кто пытается сказать вам, что вы не должны этого делать (особенно если причина в том, что «это не ОТДЫХ»)!

43 голосов
/ 03 февраля 2010

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

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

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

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

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

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

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

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

1.Простой

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

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

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

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

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

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

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

21 голосов
/ 03 февраля 2010

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

12 голосов
/ 10 августа 2013

Discoverability

Каждый ресурс имеет ссылки на другие ресурсы, либо в иерархии, либо по ссылкам, поэтому его легко просматривать. Это преимущество для человека, развивающего клиента, избавляющего его от постоянного обращения к документации и предложения предложений. Это также означает, что сервер может изменять имена ресурсов в одностороннем порядке (если клиентское программное обеспечение не кодирует 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, которое могло или не могло изменить эти точки доступа. Сколько документов вам придется перечитать?

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

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

9 голосов
/ 03 февраля 2010

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

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

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

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

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

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

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

4 голосов
/ 03 января 2013

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

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

3 голосов
/ 03 февраля 2010

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

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

2 голосов
/ 10 сентября 2014

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

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

@ 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 дизайн, по сути, простой дизайн, но это НЕ означает, что проектирование это просто. Вы видите разницу? Вам придется много думать о концепциях, которые ваше приложение будет представлять и обрабатывать, что должно быть сделано им, если вы предпочитаете, чтобы представить это с помощью ресурсов. Но если вы сделаете это, вы получите более простой и эффективный дизайн.

...