REST проти JSON-RPC? [зачинено]


251

Я намагаюся вибрати між REST та JSON-RPC для розробки API для веб-додатків. Як вони порівнюються?

Оновлення 2015: Я знайшов REST простішим у розробці та використанні для API, який подається в Web / HTTP, оскільки існуючий та зрілий протокол HTTP, який розуміється і клієнтом, і сервером, може використовувати API. Наприклад, коди відповідей, заголовки, запити, органи публікації, кешування та багато інших функцій можуть використовуватися API без додаткових зусиль чи налаштувань.


29
REST - це, безумовно, популярна відповідь саме зараз. Я не переконаний, що це завжди правильна відповідь. Можливо, може виникнути невідповідність опору REST API, орієнтованого на ресурси, та проблемного домену, який по суті базується на задачі чи робочому процесі. Якщо ви виявите, що вам потрібно робити різні типи PATCHes на одному ресурсі або що певні завдання не співпадають з певним ресурсом, вам доведеться почати згинати парадигму REST. Чи використовуєте ви дії / команди як ресурси. Чи відрізняєте типи команд у заголовку Content-Type як параметри? Не впевнений, що відповідь є одним розміром.
Ландон Поч

27
JSON-RPC - простий та послідовний, користуватися радістю.
День

1
У серпні 2015 року я реалізував і клієнт, і сервер за допомогою REST, перші 2 дні навчався, потім зрозумів, чому це популярно. Це було справжньою радістю, коли маленький додаток створено, у клієнта дійсно немає роботи запам’ятовувати різні URL-адреси, сервер на node.js та клієнт у javascript ділили ту саму структуру (URL-адреси) для спілкування. Оце Так! це було дуже швидко, продукт був доставлений всього за 15 днів, навіть з нуля. REST - це шлях. Також зауважте, що популярний Apache CouchDB використовує велику базу даних REST, дуже горді, що вони зробили і в REST. Простіше кажучи, REST - ПРАВА (правильна) з чистим інтерфейсом.
Манохар Редді Поредді,

6
Це залежить від обмежень, які ви маєте, або від вашої основної мети. Наприклад, якщо продуктивність є головним аспектом, ваш шлях - JSON-RPC (наприклад, високоефективні обчислення). Якщо ваша основна мета - бути агностиком, щоб забезпечити загальний інтерфейс для інтерпретації інших, ваш шлях - REST. Якщо ви хочете обидві цілі, ви повинні включити обидва протоколи. Ваші потреби визначають рішення.
Статіс Андронікос

@StathisAndronikos Ви маєте рацію, головна моя мета - простота у використанні та хороша ефективність для веб-додатків (а не HPC).
Алі Шакіба

Відповіді:


221

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

  • Клієнти повинні знати назви процедур;
  • Порядок параметрів процедури, типи та кількість питань. Не так просто змінити підписи процедури (кількість аргументів, порядок аргументів, типи аргументів тощо) на стороні сервера, не порушуючи реалізацію клієнта;
  • Стиль RPC не виставляє нічого, крім кінцевих точок процедури + аргументів процедури. Клієнт неможливо визначити, що можна зробити далі.

З іншого боку, у стилі REST дуже просто керувати клієнтами, включаючи керуючу інформацію у представлення (HTTP заголовки + представлення). Наприклад:

  • Можна вбудовувати посилання з анотованими типами відношень посилань, які передають значення цих URI;
  • Реалізація клієнта не повинна залежати від конкретних назв та аргументів процедури. Натомість клієнти залежать від форматів повідомлень. Це створює можливість використовувати вже реалізовані бібліотеки для конкретних медіа форматів (наприклад, Atom, HTML, Collection + JSON, HAL тощо).
  • Можна легко змінити URI, не порушуючи клієнтів, наскільки вони залежать лише від зареєстрованих (або доменних) зв’язків зв’язків;
  • Можна вбудовувати подібні структури в представлення, даючи клієнтам можливість викрити ці описи як можливості інтерфейсу, якщо кінцевий користувач є людиною;
  • Підтримка кешування - додаткова перевага;
  • Стандартизовані коди статусу;

Є ще багато відмінностей та переваг на стороні REST.


20
Що ви маєте на увазі під "обов'язковим вбудовуванням посилань, позначених із типом відношення посилань, які передають значення"?
pjz

129
"Клієнти повинні знати назви процедур" - це не аргумент, оскільки з REST це ім'я жорстко кодується в URI, а не передається як параметр. Інакше сервер не дізнається, який метод він повинен виконувати.
Центурион

44
"Не так просто змінити підписи процедур ... на стороні сервера, не порушуючи реалізацію клієнта", це також є дискусійним. І REST, і JSON-RPC не є SOAP і не мають WSDL, який описує існуючі веб-сервіси та їх типи, щоб їх можна було використовувати для динамічних змін на стороні клієнта. Отже, в будь-якому випадку, якщо ви зміните веб-сервіс, вам доведеться змінити клієнта. Інакше вам потрібно перейти з SOAP.
Центурион

64
Я зашифрував безліч додатків, але ще не бачив гнучких веб-служб. Якщо ви змінюєте сервісні сервіси та веб-сервіси, клієнт завжди потребує реконструкції / оновлення відповідно до нових вимог. І я згадав SOAP, і тому, що він має щось, що дає гнучкість, наприклад WSDL, тому ви можете автоматизувати щось та мати більшу гнучкість, оскільки ви можете отримати інформацію про набір результатів, типи даних та доступні веб-сервіси. REST та інші взагалі цього не мають. Тож ні REST, ні JSON-RPC, ні інший тип веб-сервісу не дадуть вам магії, яка б усунула необхідність оновлення клієнта вручну.
Центурион

15
Для мене, моєї поточної команди та попередніх команд, веб-сервіси RESTful призначені для додатків типу CRUD. Щодо "Чи переписуємо ми браузери кожен раз, коли щось змінюється на сервері?" - ні, оскільки браузери - лише виконавці HTTP, вони не мають нічого спільного з бізнес-логікою, яку клієнтська програма повинна реалізовувати (показувати екрани, виконувати пов'язані з цим матеріали). Схоже, ми розпочали полум'яну війну, але в цілому, я б хотів, щоб я мав ще одне надійне джерело для RESTfull веб-служб з практичним потоком використання, з магічною гнучкістю, про яку ви звертаєтесь. Тим часом багато тверджень занадто розпливчасті.
Центурион

163

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

Якщо ви приймаєте рішення про RPC, єдиною різницею є те, що ви чітко вказуєте дієслово як частину URI, що чітко, послідовно, менше баггі та насправді не викликає проблем. Особливо, якщо ви створюєте додаток, який виходить за рамки простого CRUD, єдиний шлях - RPC. У мене є ще одна проблема з RESTful пуристами: HTTP POST, GET, PUT, DELETE мають певні значення в HTTP, які REST перекосили в інші речі, просто тому, що вони підходять більшу частину часу - але не весь час.

У програмуванні я давно виявив, що намагання використовувати одну річ, щоб означати дві речі, коли-небудь обернеться і вкусить вас. Мені подобається мати можливість використовувати POST майже для кожної дії, оскільки це забезпечує свободу надсилання та отримання даних, як це потрібно зробити. Ви не можете вмістити весь світ у CRUD.


30
Ця відповідь показує надто звичне неправильне уявлення про те, що насправді є REST. REST, безумовно, не є просто відображенням CRUD-методів HTTP. Ідея, що це проблема "додати інший метод", чітко вказує на те, що REST неправильно розуміється як RPC через HTTP, що це зовсім не так. Спробуйте прочитати блог Роя Філдінгса або його дисертацію - Google допоможе вам знайти його - ви взагалі не описуєте REST у своїй відповіді.
непдев

68
Я дуже практична людина. Усі описи REST, які я прочитав, чітко починаються з відображення методів CRUD на HTTP. Більше дозволяється додавати теоретично, але на практиці - ні. Як приклад, я нещодавно хотів реалізувати PATCH для пристроїв Android, але виявив, що Android не дозволяє PATCH, тому я використовував POST із чітко визначеною дією для цього ефекту в URI. В основному, чистий REST не виконує тих робіт, які мені потрібні, тому я використовую те, що працює.
Брюс Патін

4
Отже, @BrucePatin, у вашій версії "REST" у вас є контролер з чотирма загальнодоступними методами, які відображають 1 на 1 з GET | PUT | POST | DELETE? Деякі рамки роблять це, але це не REST. Дієслова HTTP роблять розпливчасті абстрактні твердження про семантику заданого запиту. Ви повинні відповідним чином відобразити свої кінцеві точки у цих класах. GET міг би відображати багато різних кінцевих точок, як і інші. Насправді немає жодної причини, що ви не можете реалізувати повний RST JSON-RPC через HTTP.
шпигун

5
Є дуже вагома причина. Я, можливо, захочу кілька десятків дій, і вже натрапив на загальне використання (Android), який навіть не підтримує PATCH. Це вбиває холод. Я вважаю за краще бути послідовним, ніж мати справу з кількома винятками з правила. Взагалі я зараз використовуватиму лише GET, POST та DELETE. PUT не дозволяє отримати зворотний зв'язок, який я хотів би отримати в процесі оновлення. Я використовую POST майже для всього. Що стосується кешування, воно спричинило багато проблем із поверненням старих даних. Що стосується введення параметрів у POST, ASP.NET вже автоматично обробляє його з автоматичних JSON-об'єктів.
Брюс Патін

22
Я вважаю, що переслідування щодо того, що REST насправді є, лише підкреслює ваші коментарі та підкреслює головний недолік REST. Концептуально важко знайти двох людей, які повністю згодні з тим, що таке RESTful. У будь-якому разі це не має значення, тому що жодна служба не повинна залишати без документації RPC або REST. Якщо це документально, тоді у розробника, який його використовує, не повинно виникнути проблем.
Спритний джедай

29

По-перше, HTTP-REST - це архітектура перенесення стану репрезентації. Це передбачає багато цікавого:

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

По-друге, HTTP-REST повністю відповідає HTTP (див. "Безпечний" та "idempotent" у попередній частині), тому ви зможете повторно використовувати бібліотеки HTTP (існуючі для кожної існуючої мови) та зворотні проксі-сервери HTTP, що дасть вам можливість реалізовувати розширені функції (кеш, автентифікація, стиснення, перенаправлення, переписування, ведення журналів тощо) з нульовим рядком коду.

І останнє, але не менш важливе, використання HTTP як протоколу RPC - це величезна помилка, на думку дизайнера HTTP 1.1 (і винахідника REST): http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation. htm # sec_6_5_2


1
+1 для авторитетного посилання "хлопець-хто-хто повинен знати" .... Важко сперечатися за RPC через HTTP після цього, не визнаючи це хак-
хаусом

9
Ви просто посилалися на щось з 2000 року. Це більше філософський аргумент для REST проти RPC. Семантично і застосовуючи шаблон RPC, ви можете легко вважати URI "процедурою", а закодовані параметри бути ... ну ... параметри. Будь-яка модель буде добре працювати над HTTP. Те саме з SOAP, RAILS або будь-якою іншою кількістю шаблонів / протоколів, накладених на HTTP. Це не має значення, якщо ви пропонуєте послідовний API, який не порушує його контракт.
Agile Jedi

Aurélien, ви можете виправдати, чому REST легше інтегрувати з незалежними частинами програмного забезпечення? Для мене, незалежно від того, використовуєте ви RESTful API або RPC, клієнтське програмне забезпечення повинно знати формат, про який розмовляє API.
Олексій

1
@Alexey Цей аргумент стосувався безгромадянства. Це простіше інтегрувати кавоварку , чиї API є CREATE CUP, ніж інший , який буде містити INSERT COIN, SELECT COFFEE, SELECT SUGARі START. У другому API, оскільки це залежить від стану машини, ви повинні бути дуже обережними з послідовністю викликів процедури.
Aurélien

1
HTTP як протокол RPC є REST. Тож ваше неправильне тлумачення шокує навпаки.
Tiberiu-Ionuț Stan

24

Чудові відповіді - просто хотілося уточнити в деяких коментарях. JSON-RPC швидко та легко споживається, але, як згадуються ресурси та параметри, тісно пов'язані між собою і він, як правило, покладається на дієслова (api / deleteUser, api / addUser), використовуючи GET / POST, де REST надає вільно пов'язані ресурси (api / користувачів), що в HTTP REST API покладається на кілька методів HTTP (GET, POST, PUT, PATCH, DELETE). REST трохи складніше реалізовувати недосвідченим розробникам, але зараз стиль став досить поширеним, і він забезпечує набагато більшу гнучкість у довгостроковій перспективі (надаючи API більш тривалий термін експлуатації).

Поряд з тим, що не має щільно зв'язаних ресурсів, REST також дозволяє вам уникнути прихильності до одного типу контенту - це означає, якщо клієнту потрібно отримувати дані в XML, або JSON, або навіть YAML - якщо вбудований у вашу систему, ви могли б повернути будь-кого з тих, хто використовує заголовки типу вмісту / приймати.

Це дозволяє вам підтримувати API досить гнучким для підтримки нових типів вмісту АБО вимог клієнта.

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

Однак, маючи все це сказане - API MOST не є RESTful (згідно Fielding), оскільки вони не містять гіпермедіа (вбудовані гіпертекстові посилання у відповідь, які допомагають орієнтуватися в API). Більшість API, які ви дізнаєтесь, є як REST, оскільки вони слідують більшості концепцій REST, але ігнорують це обмеження. Однак все більше і більше API реалізують це, і це стає все більш практичною практикою.

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

Взагалі, я б сказав, що REST - це шлях, якщо ви хочете побудувати розширюваний, гнучкий API, який буде довготривалим. З цієї причини я б сказав, що це маршрут, який потрібно пройти 99% часу.

Удачі, Майку


3
це не ЛІГО важче, але досить надзвичайно складніше. Я намагаюся зрозуміти це протягом 4 місяців або близько того, і досі не маю гарного рішення, як написати службу, яка не переходить у RPC без громадянства через http за допомогою json, і я все ще не переконаний є реальна різниця між "REST" та тим, що я щойно сказав
Austin_Anderson

19

ІМО, ключовим моментом є орієнтація на дії та ресурси. REST орієнтований на ресурси та добре підходить для операцій CRUD, а з огляду на його відому семантику забезпечує деяку передбачуваність для першого користувача, але при застосуванні методів чи процедур змушує вас надати штучний переклад у світ, орієнтований на ресурси. З іншого боку, RPC ідеально підходить для орієнтованих на дії API, де ви відкриваєте послуги, а не набори ресурсів, здатні на CRUD.

Без сумніву, REST популярніший, але це, безумовно, додає певних балів, якщо ви хочете винести API сторонній стороні.

Якщо ні (наприклад, у випадку створення фронтального AJAX в SPA), мій вибір - RPC. Зокрема, JSON-RPC поєднується зі схемою JSON як мовою опису та транспортується через HTTP або Websockets залежно від випадку використання.

JSON-RPC - це проста і елегантна специфікація, яка визначає корисні навантаження JSON на запит і відповідь, які будуть використовуватися в синхронному або асинхронному RPC.

Схема JSON - це проект специфікації, що визначає формат на основі JSON, спрямований на опис даних JSON. Описуючи службові вхідні та вихідні повідомлення за допомогою схеми JSON, ви можете мати довільну складність у структурі повідомлень без шкоди для зручності використання, а інтеграцію послуг можна автоматизувати.

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

До цього часу це дуже моя особиста думка з цього питання, але тепер те, що може бути дуже корисним для тих розробників Java, які читають ці рядки, рамки, над якими я працював протягом останнього року, народилися з того самого питання, про яке ви задаєтеся питанням зараз :

http://rpc.brutusin.org

Тут ви можете побачити демонстрацію в реальному часі, показуючи вбудований браузер репозиторію для функціонального тестування (завдяки JSON Schema) та ряд прикладних служб:

http://demo.rpc.brutusin.org

Сподіваюсь, це допоможе товаришеві!

Начо


Чудово знайти спорідненого духу! Я працюю над чимось подібним тут: github.com/dnault/therapi-json-rpc
dnault

:) Я перегляну це
idelvall

1
Погодьтеся з цим. REST добре працює для CRUD API, оскільки у вас очевидний POST / GET / PUT / DELETE [PoGPuD? ;)] картографування. Однак якщо ваш API не підходить до цих дієслів, JSON-RPC може бути хорошим варіантом, оскільки дієслова просто змішують питання. Так так, хто це використовує і чому це великий фактор.
Алгі Тейлор

1
Саме так - REST - це царство іменників, JSON-RPC - дієслова.
Роб Грант

16

Якщо ваша послуга прекрасно працює лише з моделями та схемою GET / POST / PUT / DELETE, використовуйте чистий REST.

Я погоджуюся, що HTTP спочатку розроблений для програм без громадянства.

Але для сучасних, більш складних (!) Додатків у режимі реального часу (Інтернету), де ви хочете використовувати Websockets (які часто означають репутацію), чому б не використовувати обидва? JSON-RPC через Websockets дуже легкий, тому у вас є такі переваги:

  • Миттєві оновлення кожного клієнта (визначте власний дзвінок RPC від сервера до клієнта для оновлення моделей)
  • Легко додати складність (спробуйте зробити клон Etherpad лише REST)
  • Якщо ви зробите це правильно (додайте RPC лише як додатковий в режимі реального часу), більшість з них все ще може використовуватися лише REST (за винятком випадків, коли головною особливістю є чат чи щось таке)

Оскільки ви лише розробляєте серверний API, почніть з визначення REST-моделей і пізніше додайте підтримку JSON-RPC за необхідності, зводячи до мінімуму кількість викликів RPC.

(і вибачте за непомірне використання дужок)


15

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

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

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

Через це RPC сьогодні відчуває мене набагато простіше і природніше. Те, що мені дуже не вистачає, - це послідовна рамка, яка дозволяє легко писати служби RPC, які є самоописом та сумісними. Тому я створив власний проект для експерименту з новими способами полегшити RPC для себе, і, можливо, хтось ще вважає це корисним: https://github.com/aheck/reflectrpc


Перевірте OpenRPC, він повинен вирішити вашу потребу в "простому записі RPC-послуг, які є самоописом і сумісними"
Belfordz

11

Відповідно до моделі зрілості Річардсона , питання не в REST проти RPC , а в тому, скільки REST ?

На цей погляд, відповідність стандарту REST можна класифікувати на 4 рівні.

  • рівень 0: продумайте дії та параметри. Як пояснюється у статті, це по суті еквівалентно JSON-RPC (стаття пояснює це для XML-RPC, але для обох є однакові аргументи).
  • рівень 1: мислити з точки зору ресурсів. Все, що стосується ресурсу, належать до однієї URL-адреси
  • рівень 2: використовувати дієслова HTTP
  • рівень 3: HATEOAS

За словами творця стандарту REST, лише послуги 3 рівня можна назвати RESTful. Однак це показник відповідності , а не якості. Якщо ви просто хочете викликати віддалену функцію, яка виконує обчислення, напевно, немає сенсу мати відповідні гіперпосередкові зв’язки у відповіді, а також диференціацію поведінки на основі використовуваного дієслова HTTP. Отже, такий виклик за своєю суттю має тенденцію бути більш подібним до RPC. Однак нижчий рівень відповідності не обов'язково означає державність або вищу взаємодію. Можливо, замість того, щоб думати REST проти RPC , ви повинні використовувати якомога більше REST, але не більше. Не перекручуйте додаток лише для того, щоб він відповідав стандартам RESTful відповідності.


1
+1 для рівнів 0, 1 і 2. Однак я ніколи не бачив успішної реалізації HATEOS, але бачив дві жалюзі невдалі спроби.
mjhm

8

Чому JSON RPC:

У випадку API REST, ми повинні визначити контролер для кожної функціональності / методу, який може знадобитися. Як результат, якщо у нас є 10 методів, які ми хочемо доступні клієнту, ми повинні написати 10 контролерів, щоб інтерфейс запиту клієнта до певного методу.

Інший фактор - навіть якщо ми маємо різні контролери для кожного методу / функціональності, клієнт повинен пам’ятати, чим раніше використовувати POST або GET. Це ще більше ускладнює справи. Крім того, щоб надсилати дані, потрібно встановити тип вмісту запиту, якщо використовується POST.

У випадку JSON RPC все значно спрощується, оскільки більшість серверів JSONRPC працюють за методами POST HTTP, а тип вмісту завжди є application / json. Це знімає навантаження на запам'ятовування, щоб використовувати належний метод HTTP та налаштування вмісту на стороні клієнта.

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

Чому ПОЧАТИ:

У вас є окремі URL-адреси для різних функціональних можливостей, які сервер хоче піддати клієнтові. Як результат, ви можете вставити ці URL-адреси.

Більшість із цих питань є дискусійними та повністю залежать від потреби людини.


3

Я думаю, як завжди, це залежить ...

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

Тому, коли ви пишете веб-додаток на одній сторінці, який повинен поговорити з бекендом, то я думаю, що REST є занадто складним. У цій ситуації вам не доведеться турбуватися про довгострокову сумісність, оскільки додаток та API можуть розвиватися разом.

Я колись починав з REST для однієї сторінки веб-програми, але дрібнозернисті команди між веб-додатком та сервером швидко звели мене з розуму. Чи слід кодувати його як параметр шляху? В організмі? Параметр запиту? Заголовок? Після дизайну URL / Verb / Response мені довелося кодувати цей безлад у Javascript, декодері в Java, а потім викликати власне метод. Незважаючи на те, що для цього існує безліч інструментів, дуже важко не отримувати HTTP-семантики у вашому доменному коді, що є дуже поганою практикою. (Згуртованість)

Спробуйте створити файл Swagger / OpenAPI для середньоскладного сайту та порівняйте його з єдиним інтерфейсом Java, який описує віддалені процедури у цьому файлі. Зростання складності є приголомшливим.

Тому я перейшов з REST на JSON-RPC для однієї сторінки webapp. a я розробив крихітну бібліотеку, яка закодувала інтерфейс Java на сервері та відправила його до браузера. У браузері це створило проксі для коду програми, який повертав обіцянку для кожної функції.

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


1
Ця відповідь змусила мене зрозуміти схожість між GraphQL та JSON-RPC, і чому GraphQL стає популярним вибором для SPA.
Денніс

OpenRPC еквівалент OpenAPI / Swagger, але для JSON-RPC
Belfordz

1

REST тісно поєднаний з HTTP, тому якщо ви виставляєте лише свій API через HTTP, то REST більше підходить для більшості (але не для всіх) ситуацій. Однак, якщо вам потрібно розкрити свій API над іншими транспортами, такими як обмін повідомленнями або веб-сокетами, REST просто не застосовується.


2
REST - це архітектурний стиль і не залежить від протоколу.
Марк Сідаде

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

1

Було б краще вибрати JSON-RPC між REST та JSON-RPC, щоб розробити API для веб-додатків, який легше зрозуміти. JSON-RPC є кращим, оскільки його відображення до викликів методів та комунікацій легко зрозуміти.

Вибір найбільш підходящого підходу залежить від обмежень або основної мети. Наприклад, що стосується того, що продуктивність є головною ознакою, доцільно звернутися до JSON-RPC (наприклад, High Performance Computing). Однак, якщо головна мета - агностик, щоб запропонувати загальний інтерфейс, який слід зробити іншим, доцільно перейти на REST. Якщо вам потрібно досягти обох цілей, бажано включити обидва протоколи.

Те, що насправді розділяє REST від JSON-RPC, - це те, що він проходить ряд ретельно продуманих обмежень, що підтверджують архітектурну гнучкість. Обмеження полягають у тому, що клієнт та сервер здатні рости незалежно один від одного (зміни можна проводити, не псуючи додаток клієнта), дзвінки без громадянства (стан розглядають як гіпермедіа), єдину форму Інтерфейс пропонується для взаємодії, API вдосконалений у багатошаровій системі (Hall, 2010). JSON-RPC є швидким і простим у споживанні, однак, як згадані ресурси, так і параметри тісно пов'язані, і це, ймовірно, залежить від дієслів (api / addUser, api / deleteUser) за допомогою GET / POST, тоді як REST надає вільно пов'язані ресурси (api / користувачів) у HTTP. API REST залежить від декількох методів HTTP, таких як GET, PUT, POST, DELETE, PATCH.

JSON (позначається як JavaScript Object Notation) як легкий формат обміну даними, для людей легко читати та писати. Машини розбирають і генерують без проблем. JSON - це текстовий формат, повністю незалежний від мови, але практикує конвенції, знайомі програмістам сімейства мов, що складаються з C #, C, C ++, Java, Perl, JavaScript, Python та багатьох інших. Такі властивості роблять JSON ідеальним мовою обміну даними та кращим вибором.


"Без проблем без проблем розбирати машини" - Я бачив безліч розбитих JSON (наприклад, незбільшені котирування корисного навантаження)
alancalvitti

1

Неправильне питання: нав'язує маніхея, якого не існує!

Ви можете використовувати JSON-RPC з "менш дієсловом" (без методу ) і зберегти мінімальну стандартизацію, необхідну для ідентифікатора sendo, параметрів, кодів помилок та попередження повідомлень. Стандарт JSON-RPC не говорить "ти не можеш бути REST", а лише сказати, як упакувати основну інформацію.

"REST JSON-RPC" існує ! REST з "найкращими методами", для мінімальної упаковки інформації, з простими та надійними контрактами.


Приклад

цієї відповіді та дидактичного контексту)

Діючи з REST, це, як правило, допомагає почати з мислення з точки зору ресурсів. У цьому випадку ресурс - це не просто "банківський рахунок", але це транзакція цього банківського рахунку ... Але JSON-RPC не зобов'язує параметр "метод", всі кодуються "шляхом" кінцевої точки.

  • REST Депозит із POST /Bank/Account/John/Transactionзапитом JSON {"jsonrpc": "2.0", "id": 12, "params": {"currency":"USD","amount":10}}.
    Відповідь JSON може бути щось подібне{"jsonrpc": "2.0", "result": "sucess", "id": 12}

  • ВІДКРИТТЯ Зняти з POST /Bank/Account/John/Transaction... подібним.

  • ... GET /Bank/Account/John/Transaction/12345@13... Це може повернути запис JSON про цю точну транзакцію (наприклад, ваші користувачі, як правило, хочуть записувати дебети та кредити на своєму рахунку). Щось таке {"jsonrpc": "2.0", "result": {"debits":[...],"credits":[...]}, "id": 13}. Конвенція про (REST) ​​GET-запит може включати в себе кодування ідентифікатора за допомогою "@id", тому не потрібно надсилати жоден JSON, але все ще використовуючи JSON-RPC у пакеті відповідей.



0

Якщо ви вимагаєте ресурсів, то RESTful API краще за дизайном. Якщо ви вимагаєте складних даних з великою кількістю параметрів і складних методів, відмінних від простого CRUD, то RPC - це правильний шлях.


Це дуже велике надмірне спрощення теми. Чому конкретно це "Краще за дизайном"? JSON-RPC може бути настільки простим або настільки ж складним, як ви хочете, і тому аргумент того, що він є "кращим" для "багатьох параметрів і складних методів", також є помилковим. У цьому питанні це не краще і не гірше
Belfordz

Не має значення, чи RPC використовує JSON або protobuf або XML для серіалізації даних. Як я вже сказав, ключовим моментом є API. Я не маю на увазі, що один кращий за інших у всіх випадках. Але я думаю, що параметри та методи мають значення, коли ви обираєте між двома реалізаціями. Якщо вони прості, більшість програмістів добре розуміють API RESTful, і ви можете легко сконструювати http-запит. Якщо вони складні, RPC здатний виражати такі API, і ваш IDE та компілятор можуть допомогти вам у цьому.
Адріан Лю

-1

Я використовую vdata для протоколу RPC: http://vdata.dekuan.org/

1, PHP та JavaScript - це добре. 2, виклик спільного використання ресурсів (CORS) все ще добре.

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