Відмінності веб-служб між REST та RPC


100

У мене є веб-служба, яка приймає параметри JSON і має конкретні URL-адреси для методів, наприклад:

http://IP:PORT/API/getAllData?p={JSON}

Це точно НЕ ВІДПОЧИНОК, оскільки це не без громадянства. Він враховує файли cookie та має власну сесію.

Це RPC? У чому різниця між RPC та REST?


1
Чому це має значення, це REST чи RPC? Яка ваша причина запитувати?
Богдан

5
Послуга не є моєю, і в ній зазначено, що це ЗАПУСК, але, схоже, це не так. Я хотів з’ясувати, чи не помиляюсь я, що це не РЕСТ.
Мазмарт

106
Причиною є знання @Bogdan.
Сер,

Відповіді:


68

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

Одне обмеження REST полягає в тому, що він повинен бути без громадянства. Якщо у вас сесія, то у вас є штат, тому ви не можете зателефонувати до своєї служби RESTful.

Той факт, що у вас є дія у вашій URL-адресі (тобто getAllData), є показником до RPC. У REST ви обмінюєтесь поданнями, і виконувана вами операція продиктована дієсловами HTTP. Крім того, у REST узгодження вмісту не виконується з ?p={JSON}параметром.

Не знаю, чи є ваша послуга RPC, але це не RESTful. Ви можете дізнатись про різницю в Інтернеті, ось стаття для початку: Розвінчання міфів про RPC та REST . Ви краще знаєте, що знаходиться у вашій службі, тому порівняйте її функції з тим, що таке RPC, і зробіть власні висновки.


отже RESTful означає, що він дотримується всіх стандартів, крім REST, коли може вирішити не дотримуватися стандартів ?.
Мазмарт

4
@Mazmart: REST - це набір вказівок та обмежень. Це не специфікація, яку можна впровадити, і коли вони заявляють, що мають послугу RESTful. З того, що я помітив, більшість випадків люди називають все, що не є SOAP, як REST, а насправді це просто якийсь інший тип RPC.
Богдан

122

Розглянемо наступний приклад API HTTP, що моделює замовлення, розміщені в ресторані.

  • RPC API розглядає терміни "дієслова", виставляючи функціональність ресторану як виклики функцій, що приймають параметри, і викликає ці функції за допомогою дієслова HTTP, яке здається найбільш доречним - "get" для запиту тощо, але назва цього дієслова є суто випадковим і не має реального впливу на фактичну функціональність, оскільки ви щоразу викликаєте іншу URL-адресу . Коди повернення кодуються вручну та є частиною договору про надання послуг.
  • На відміну від цього, REST API моделює різні сутності в межах проблемного домену як ресурси та використовує HTTP-дієслова для представлення транзакцій проти цих ресурсів - POST для створення, PUT для оновлення та GET для читання. Усі ці дієслова, викликані за однією URL-адресою , забезпечують різну функціональність. Загальні коди повернення HTTP використовуються для передачі стану запитів.

Розміщення замовлення:

Отримання замовлення:

Оновлення замовлення:

Приклад взято з sites.google.com/site/wagingguerillasoftware/rest-series/what-is-restful-rest-vs-rpc


33
Нарешті, кілька прикладів URL.
Фабіан Піконе

4
Я не згоден з тим, що ви говорите щодо URL-адрес. Ви можете мати всі RPC-дзвінки за однією URL-адресою, а REST - за різними URL-адресами. Ви показуєте лише одну сторону медалі.
basickarl

Те, що ви описуєте тут, не є ВІДПУСКОМ - REST - це архітектурний шаблон. Ви описуєте REST через HTTP, про що думають більшість людей, коли говорять про REST.
d4nyll

36

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

--------------------------- + ---------------------- --------------- + --------------------------
  Експлуатація                  | RPC (операція)                      | Відпочинок (ресурс)
--------------------------- + ---------------------- --------------- + --------------------------
 Реєстрація | POST / реєстрація | POST / осіб           
--------------------------- + ---------------------- --------------- + --------------------------
 Подати у відставку | POST / звільнення | ВИДАЛИТИ / persons / 1234    
--------------------------- + ---------------------- --------------- + --------------------------
 Читаюча людина | GET / readPerson? Personid = 1234 | GET / осіб / 1234       
--------------------------- + ---------------------- --------------- + --------------------------
 Прочитати список предметів людини | GET / readUsersItemsList? Userid = 1234 | GET / persons / 1234 / items
--------------------------- + ---------------------- --------------- + --------------------------
 Додати предмет у список людей | POST / addItemToUsersItemsList | POST / person / 1234 / items
--------------------------- + ---------------------- --------------- + --------------------------
 Оновити елемент | POST / modifyItem | ПУТ / предмети / 456          
--------------------------- + ---------------------- --------------- + --------------------------
 Видалити елемент | POST / removeItem? ItemId = 456 | ВИДАЛИТИ / items / 456       
--------------------------- + ---------------------- --------------- + --------------------------

Примітки

  • Як видно з таблиці, REST, як правило, використовує параметри шляху URL-адреси для ідентифікації конкретних ресурсів
    (наприклад GET /persons/1234), тоді як RPC, як правило, використовує параметри запиту для входів функцій
    (наприклад GET /readPerson?personid=1234).
  • У таблиці не показано, як API REST буде обробляти фільтрацію, яка зазвичай включає параметри запиту (наприклад GET /persons?height=tall).
  • Також не показано, як в будь-якій системі, коли ви створюєте / оновлюєте операції, додаткові дані, ймовірно, передаються через тіло повідомлення (наприклад, коли ви це робите, POST /signupабо POST /personsви включаєте дані, що описують нову особу).
  • Звичайно, нічого з цього не встановлено, але це дає вам уявлення про те, з чим ви, мабуть, зіткнетесь, і про те, як ви можете організувати власний API для узгодженості. Для подальшого обговорення дизайну URL-адреси REST див. Це питання .

28

Це RPC за допомогою http . Правильна реалізація REST повинна відрізнятися від RPC. Мати логіку для обробки даних, як метод / функція, - це RPC. getAllData () - це розумний метод. REST не може мати інтелект, це повинні бути дані, які можуть бути перевірені зовнішнім інтелектом .

Більшість реалізацій, які я бачив сьогодні, - це RPC, але багато хто помилково називають це REST. REST з HTTP - це рятівник, а SOAP із XML - лиходій. Тож ваша плутанина виправдана, і ви маєте рацію, це НЕ ВІДПУСК.

Протокол Http не робить реалізацію REST. Як REST (GET, POST, PUT, PATCH, DELETE), так і RPC (GET + POST) можуть бути розроблені за допомогою HTTP (наприклад: через проект веб-API у Visual Studio).

Прекрасно, але що тоді таке «РЕСТ»? Модель зрілості Річардсона наведена нижче (узагальнено). Тільки рівень 3 є RESTful.

  • Рівень 0: Http POST
  • Рівень 1: кожен ресурс / сутність має URI (але все ще лише POST)
  • Рівень 2: можна використовувати як POST, так і GET
  • Рівень 3 (RESTful): використовує HATEOAS (гіпермедіа-посилання) або, іншими словами, самостійно досліджуючі посилання

наприклад: рівень 3 (HATEOAS):

  1. Посилання стверджує, що цей об’єкт можна оновити таким чином і додати таким чином.

  2. Посилання стверджує, що цей об’єкт можна читати лише, і саме так ми це робимо.

    Зрозуміло, що відправки даних недостатньо, щоб стати REST, але про те, як запитувати дані, також слід згадати. Але знову ж таки, чому ці 4 кроки? Чому це не може бути просто кроком 4 і назвати його REST? Річардсон просто дав нам поетапний підхід, щоб туди дійти, ось і все.

Ви створили веб-сайти, якими можуть користуватися люди. Але чи можете ви також створювати веб-сайти, придатні для використання на машинах? Саме в цьому майбутнє, і RESTful Web Services покаже вам, як це зробити.

PS: REST надзвичайно популярний, як і автоматизоване тестування, але коли справа стосується реальних прикладів .. ну ..


1
Перший абзац дуже просто і зрозуміло пояснює різницю. У мене є +1 :)
Ніколас

12

REST найкраще описати для роботи з ресурсами, де RPC більше стосується дій.

REST розшифровується як представницький державний трансфер. Це простий спосіб організувати взаємодію між незалежними системами. Додатки RESTful зазвичай використовують HTTP-запити для розміщення даних (створення та / або оновлення), читання даних (наприклад, запитів) та видалення даних. Таким чином, REST може використовувати HTTP для всіх чотирьох операцій CRUD (Create / Read / Update / Delete).

RPC в основному використовується для зв'язку між різними модулями для обслуговування запитів користувачів. наприклад, у openstack, як те, як nova, погляд і нейтрон працюють разом при завантаженні віртуальної машини.


4

Я міг би стверджувати:

Чи зберігає / володіє даними моя організація? Потім RPC: ось копія деяких моїх даних, маніпулюйте копією даних, яку я вам надсилаю, і поверніть мені копію вашого результату.

Чи має викликана сутність / володіє даними? Потім REST: або (1) покажіть мені копію деяких ваших даних, або (2) маніпулюйте деякими своїми даними.

Зрештою, мова йде про те, яка «сторона» дії володіє / зберігає дані. І так, ви можете використовувати REST verbiage для спілкування з системою, що базується на RPC, але ви все одно будете робити RPC-діяльність, роблячи це.

Приклад 1: У мене є об'єкт, який здійснює зв'язок із реляційним сховищем баз даних (або будь-яким іншим типом сховища даних) через DAO. Має сенс використовувати стиль REST для взаємодії між моїм об’єктом та об’єктом доступу до даних, який може існувати як API. Моя сутність не володіє / не зберігає дані, а реляційна база даних (або нереляційне сховище даних).

Приклад 2: Мені потрібно зробити багато складної математики. Я не хочу завантажувати купу математичних методів у свій об’єкт, я просто хочу передати деякі значення іншому, що може робити всі види математики, і отримати результат. Тоді стиль RPC має сенс, оскільки математичний об'єкт / сутність відкриє моєму об'єкту цілу купу операцій. Зверніть увагу, що всі ці методи можуть бути представлені як окремі API, і я можу викликати будь-який із них за допомогою GET. Я навіть можу стверджувати, що це RESTful, тому що я телефоную через HTTP GET, але насправді під ковдрами це RPC. Моя сутність володіє / зберігає дані, віддалена сутність просто виконує маніпуляції з копіями даних, які я надіслав їй.


4

Через HTTP вони обидва в кінцевому підсумку є просто HttpRequestоб'єктами, і вони обидва очікують HttpResponseповернення об'єкта. Я думаю, що можна продовжувати кодування з цим описом і турбуватися про щось інше.


2

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

Я б цитував абзац із того самого посилання, яке мені виділялося:

Сам REST - це опис принципів дизайну, що лежать в основі HTTP та всесвітньої мережі. Але оскільки HTTP - єдиний комерційно важливий REST API, ми в основному можемо уникати обговорення REST і просто зосередитись на HTTP. Ця заміна корисна, оскільки існує багато плутанини та мінливості у тому, що, на думку людей, означає REST в контексті API, але є набагато більша чіткість і згода щодо того, що таке сам HTTP. Модель HTTP є ідеальним зворотом до моделі RPC - у моделі RPC адресовані одиниці є процедурами, а сутності проблемного домену приховані за процедурами. У моделі HTTP адресними одиницями є самі сутності, а поведінка системи прихована за сутностями як побічні ефекти їх створення, оновлення або видалення.


1

Ось як я розумію і використовую їх у різних випадках використання:

Приклад: Управління рестораном

варіант використання для REST : управління замовленнями

- create order (POST), update order (PATCH), cancel order (DELETE), retrieve order (GET)
- endpoint: /order?orderId=123

Для управління ресурсами REST є чистим. Одна кінцева точка із заздалегідь визначеними діями. Це можна побачити як виставити екземпляри БД (Sql або NoSql) або класу всьому світу.

Приклад реалізації:

class order:
    on_get(self, req, resp): doThis.
    on_patch(self, req, resp): doThat.

Приклад фреймворку: Falcon для python.

варіант використання для RPC : управління операцією

- prepare ingredients: /operation/clean/kitchen
- cook the order: /operation/cook/123
- serve the order /operation/serve/123

Для аналітичних, оперативних, невідповідних, нерепрезентативних, заснованих на дії, RPC працює краще, і цілком природно думати функціонально.

Приклад реалізації:

@route('/operation/cook/<orderId>')
def cook(orderId): doThis.

@route('/operation/serve/<orderId>')
def serve(orderId): doThat.

Приклад фреймворку: колба для python

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.