Яка перевага використання REST замість не-REST HTTP?


Відповіді:


162

Я не думаю , що ви отримаєте хорошу відповідь на це, почасти тому , що на самому ділі ніхто не погоджується на те , що 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відповідати операціям "створити" та "оновити" (але ніхто не погоджується в який бік).

Я думаю, що аргументи кешування неправильні, тому що рядки запитів, як правило, кешовані, і крім того, вам не потрібно їх використовувати. Наприклад, джанго робить щось подібне дуже легко, і я б не сказав, що це 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: Непросто в одному запиті зробити більше ніж одну річ або вказати, які частини складного об’єкта ви хочете отримати. Це особливо важливо для мобільних пристроїв, коли час подорожі може бути значним, а з'єднання ненадійними. Наприклад, припустимо, ви отримуєте повідомлення на часовій шкалі у фейсбуці. «Чистий» спосіб 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, тож давайте подивимося, що вони роблять:

За замовчуванням більшість властивостей об’єкта повертаються, коли ви робите запит. Ви можете вибрати поля (або з'єднання), які потрібно повернути, за допомогою параметра запиту "поля". Наприклад, ця URL-адреса поверне лише ідентифікатор, ім’я та зображення Бена: https://graph.facebook.com/bgolub?fields=id,name,picture

Я поняття не маю, як ви зробили щось подібне з REST, і якщо ви зробили це, чи все одно це вважатиметься 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: "Простий", оскільки він дає вам просту основу для роботи. REST - це HTTP! Це набагато простіше, ніж SOAP (який навіть у своїй назві є простим). "допомагає вам організувати" - концепція не дуже складна для розуміння, і, як тільки вона буде реалізована правильно, - це робить все дуже добре. REST може бути, як спосіб розробки програми, а не деталізацією щодо реалізації. Як зазначає Даррел, його реалізація може бути нелегкою, але результат корисний. "Новим клієнтам це легко використовувати ваш додаток" - Знову: REST - це HTTP.
Еміль Іванов

31

Простіше кажучи: НІКОЛИ .

Не соромтеся звертати увагу, але я все ще думаю, що реальної вигоди від не-REST HTTP немає. Усі поточні відповіді недійсні. Аргументи з найбільш голосованої відповіді:

  • Простий.
  • Ви можете добре використовувати кеш HTTP і проксі-сервер, щоб допомогти вам справлятися з високим навантаженням.
  • Це допомагає вам організувати навіть дуже складне додаток у прості ресурси.
  • Новим клієнтам це легко використовувати ваш додаток, навіть якщо ви не створили його спеціально для них (можливо, тому, що вони не були поруч під час створення вашої програми).

1. Простий

З REST потрібен додатковий рівень зв'язку для сценаріїв на стороні сервера та клієнта => це насправді складніше, ніж використання HTTP, який не REST.

2. Кешування

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

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

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

4. Простий у використанні / реалізації

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


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

2
виправдайте, що це не взаємовиключне (ви можете мати api без спокою, який є кешованим), але використання підходу до дизайну api заохочує, і на практиці це, безумовно, актуально, оскільки це заохочує різні найкращі практики (відкриття, загальні інтерфейси, керованість, інтелектуальне моделювання ресурсів )
Скотт Шультесс

4
"REST не допомагає вам організовувати речі. Це змушує вас використовувати API, підтримуваний бібліотекою на сервері, яку ви використовуєте." Я не впевнений, що ти маєш на увазі під цим. Цілком можливо (і не більше складно, ніж створити не-REST API) створити API RESTful без використання додаткової рамки на стороні сервера.
Майкл О.

2
"З REST потрібен додатковий рівень зв'язку" - humbug, ви можете просто використовувати вашу існуючу бібліотеку HTTP.
Søren Boisen

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

23

Найбільшою перевагою IMHO, яку дозволяє REST, є скорочення зв'язку клієнт / сервер. Набагато простіше розвивати інтерфейс REST з часом, не порушуючи існуючих клієнтів.


4
Чи можете ви навести приклад? Дякую!
Ян Żankowski

3
Хіба це не залежало б від того, наскільки абстрагованим був ваш не-REST API?
johnny

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

@DarrelMiller Чи можете ви, будь ласка, розробити, як REST скорочує з'єднання клієнта / сервера краще, ніж підхід, що не стосується REST? Я вважаю, що ти вказуєш на точку, яку Тиммм сказав у своїй відповіді. Ознайомтесь з останнім коментарем у відповіді Timmmm
emilly

Системи @emilly REST не покладаються на інформацію про позадіапазонну інформацію, щоб мати можливість обробляти відповідь. Немає жодних припущень щодо того, що може повернутися з конкретного запиту. Відповідь повідомляє вам все, що потрібно знати. Це дозволяє серверу змінювати свою поведінку, і клієнт може знати про ці зміни.
Даррел Міллер

15

Виявність

Кожен ресурс має посилання на інші ресурси, або в ієрархії, або посиланнях, тому їх легко переглядати. Це перевага для людини, що розвиває клієнта, врятує його / вона від постійних консультацій з документами та надання пропозицій. Це також означає, що сервер може змінювати імена ресурсів в односторонньому порядку (до тих пір, поки клієнтське програмне забезпечення не жорстко кодує URL-адреси).

Сумісність з іншими інструментами

Ви можете КРУГАТИ свій шлях у будь-яку частину API або використовувати веб-браузер для навігації по ресурсах. Полегшує налагодження та тестування інтеграції набагато простіше.

Стандартизовані іменні дієслова

Дозволяє вказувати дії, не вимагаючи правильного формулювання. Уявіть, якби НПЗ та сетери не були стандартизовані, а хтось використовував retrieveі defineнатомість. Вам слід запам'ятати правильне дієслово для кожної окремої точки доступу. Знаючи, що існує лише декілька дієслівних лічильників, які вирішують цю проблему.

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

Якщо у вас немає GETресурсу, ви можете бути впевнені, що отримаєте 404помилку в RESTful API. Порівнюйте його з не-RESTful API, який може повернутись {error: "Not found"}загорнутий у Бога, знає скільки шарів. Якщо вам потрібен додатковий простір, щоб написати повідомлення розробнику з іншого боку, ви завжди можете використовувати тіло відповіді.

Приклад

Уявіть два API з однаковим функціоналом: один слід за REST, а інший ні. Тепер уявіть наступних клієнтів для цих API:

Відпочинок:

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
Ось чому я намагаюся з’ясувати, чому це краще :-)
Димитрій C.

7
Письмо було знято.
surfen


5

Я б запропонував усім, хто шукає відповідь на це питання, пройти цей «слайд-шоу» .

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


3

Кешування.

Є й інші більш глибокі переваги REST, які обертаються навколо еволюціоністської здатності через вільне з'єднання та гіпертекст, але механізми кешування є основною причиною, коли вам слід піклуватися про RESTful HTTP.


3
Чи можете ви навести приклад того, що може бути кешоване і чому кешування не відбудеться з не-REST рішенням?
Димитрій К.

2
@Dimitri C .: Посилання wikipedia.org/article?id=19 не буде кешоване проксі, оскільки воно ігнорує параметри, передані в URL-адресі. З іншого боку, посилання wikipedia.org/REST буде кешоване, зрозуміло?
ВП.

6
Якщо кешування було основною перевагою REST, я можу запевнити вас, що я б не витратив останні два роки на створення RESTful послуг.
Даррел Міллер

Дарреле, ти можеш будувати системи, які знаходяться в масштабі розповсюдження, в якому вільне сполучення має найважливіше значення (цікаво дізнатись, що це за системи), але більшість людей це не - або вони використовують технології (тобто браузери та html), у яких велика більшість важкої роботи робиться для них.
Майк

1
То чому б не просто використовувати, GET /get_article/19/і POST /update_articleякщо кешування - це ваша турбота. Ви все ще можете зробити все , що тільки з GETі POSTі я вважаю , RESTозначає «використання GET, POST, PUTі DELETEтільки.» а не лише "Не використовуйте рядки запитів". тож, що я запропонував, не було б REST. Потім знову ніхто не може погодитись, що REST це таке, тому я кладу це у відро з "Веб 2.0".
Timmmm

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. Чому? тому що метод "отримати" має таку здатність перешкоджати ...
В.П.

0

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


1
Опис веб-сервісу RESTful з документом WADL перемагає одну з головних переваг REST, зокрема, всі переваги, отримані від гіпермедіа.
Томас Ейзінгер

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

WADL чудово справляється з описом HTTP API, тому що саме для цього він був розроблений. Залежно від послуги, яку надає ця компанія, WADL може бути або не бути хорошою ідеєю. Якщо служба не скористається гіпермедіа і просто серіалізує деякі об'єкти в JSON, вони також повинні надати документацію (WADL, Swagger тощо) про те, як працює їх служба та що вона очікує / повертає. WADL сама по собі зовсім не погана, вона просто не є правильним інструментом для (справді) РЕСТЕВНОГО веб-сервісу.
Томас Ейзінгер

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 (створювати, читати / отримувати, оновлювати, видаляти)."

: RDBMS також використовує підхід CRUD (SELECT / INSERT / DELETE / UPDATE), і завжди є спосіб представити та діяти на моделі даних.

Щодо вашого вироку

"Ви навіть не можете мати справу з ресурсами типу об'єкта"

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


-1

Пошукові системи можуть ігнорувати рядки запитів.


8
Використання рядка запиту абсолютно RESTful.
Еміль Іванов

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

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.