Це REST API справді RPC? Рой Філдінг, здається, так думає


99

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

З першого абзацу API REST API Роя Філдінга повинен бути орієнтований на гіпертекст , зрозуміло, що він вважає, що його робота широко тлумачиться неправильно:

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

Філдінг продовжує перераховувати кілька атрибутів API REST. Деякі з них, здається, суперечать як загальній практиці, так і загальним порадам на ПЗ та інших форумах. Наприклад:

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

  • API REST не повинен визначати імена фіксованих ресурсів або ієрархії (очевидна зв'язок клієнта і сервера). ...

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

Ідея "гіпертексту" відіграє центральну роль - набагато більше, ніж структура URI або те, що означають HTTP дієслова. "Гіпертекст" визначений в одному з коментарів:

Коли я [Філдінг] кажу гіпертекст, я маю на увазі одночасне представлення інформації та керування таким чином, що інформація стає дозволом, завдяки якому користувач (або автомат) отримує вибір і вибирає дії. Hypermedia - це лише розширення того, що означає текст для включення тимчасових якорів у медіапотік; більшість дослідників скинули цю різницю.

Гіпертекст не повинен бути HTML у браузері. Машини можуть переходити посилання, коли вони розуміють формат даних та типи зв’язків.

Я здогадуюсь на цьому етапі, але перші два пункти вище, здається, припускають, що документація API для ресурсу Foo, яка виглядає так, веде до щільного зв’язку між клієнтом та сервером і не має місця в системі RESTful.

GET   /foos/{id}  # read a Foo
POST  /foos/{id}  # create a Foo
PUT   /foos/{id}  # update a Foo

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

Крім того, кожного разу, коли запитується URI до ресурсу Foo, відповідь містить всю інформацію, необхідну агенту, щоб дізнатися, як діяти, наприклад, отримуючи доступ до асоційованих та батьківських ресурсів через їх URI, або вживаючи заходів після створення / видалення ресурсу.

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

Але це лише моє найкраще здогадування на даний момент.

Філдінг опублікував подальші дії, в яких він відповів на критику, що його обговорення було занадто абстрактним, не маючи прикладів і багатим жаргоном:

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

Отже, два простих питання для експертів REST з практичним мисленням: як ви інтерпретуєте те, що говорить Філдінг, і як ви втілюєте це в життя під час документування / впровадження API REST?

Редагувати: це питання є прикладом того, як важко щось дізнатися, якщо у вас немає імені для того, про що ви говорите. Назва в цьому випадку - "Гіпермедіа як двигун стану заявки" (HATEOAS).


26
Джон, Річ просто пояснює зміни у своєму мисленні. У цьому немає нічого суб'єктивного чи аргументативного. Голосувати за те, щоб бути відкритим - це одне з кращих питань, позначених «відпочинок», які я бачив на SO.
Кіт Гоген

4
Кіт, "пояснення зміни настрою" - це те, що він повинен робити у своєму блозі, а не на SO.
Джон Сондерс

13
Він не пояснює свою зміну настрою, він запитує, чи правильно його розуміння.
aehlke

4
Відмінна резюме. Я дізнався більше з цього питання, ніж з більшості відповідей.
Мартін Конечний

Відповіді:


21

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

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

Якщо ви документуєте URI або як їх скласти, ви робите це неправильно.


Це все-таки правда? Є специфікації відповідей API, як Ionspec, які зробили ці URI, як частину відповіді навмисно.
Шон

Так, вони мають. Тоді питання про те, щоб визначити, чи є ці документально зареєстровані URI-адреси лише вхідними точками до програми, які гарантовано залишаються (деякі з них не є рідкістю і дуже корисними), або якщо люди хочуть генерувати код, ті вставляються з специфікація прямо в код, не даючи серверу повідомляти клієнту про те, як він може щось робити. Якщо клієнт вважає, що це знає завдяки цьому договору, ви не перебуваєте в гіпермедіа, ви перебуваєте в сучасній моделі мила openapi з тими ж проблемами, з якими ви стикалися з цим 18 років тому.
SerialSeb

Щоправда, це те, що багато мов документації API заробили за останні 11 років, але основи не змінилися. Я вважаю, що цінність виявлення цих посилань або, принаймні, виявлення шаблону URI полягає у створенні багаторазового загального клієнтського коду, який може динамічно використовувати їх, дозволяючи багатьом реалізаціям на стороні сервера повторно використовувати той самий клієнтський код. Вбудовування URI продовжує ускладнювати такі сценарії, але якщо ви використовуєте ці формати, ви, як правило, щільно поєднуєте згенерований клієнт із цими специфікаціями, тому ви вже втратили цю функцію.
SerialSeb

8

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

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


2
Ого. Ця сторінка ресурсної моделі принесла мені сльозу. Будемо сподіватися, що це започаткує тенденцію.
Даррел Міллер

Прикро, що це єдиний приклад такого API в Інтернеті! Гірше того, що немає хороших прикладів клієнтського коду, який би відповідав принципу взагалі (що я знайшов).
jkp

1
@DarrelMiller Чи не є ці типи медіа занадто "специфічними"? Мені здається, що їх API справді використовує лише один MIME: application/jsonі що Ресурсна модель справді є відносинами. Я неправильно зрозумів цей аспект REST? Я також прочитав одну з ваших відповідей на відповідь, яка, схоже, вказує на те, що слід уникати тих договорів, що мають "один атрибут" ...
edsioufi

2
@RichApodaca Ваше посилання померло від дизентерії. web.archive.org/web/20170409132237/https://kenai.com/projects/…
forresthopkinsa

5

Я шукав хороший приклад API, написаного після HATEOAS, і мав проблеми з його пошуком (мені було важко застосувати і SunCloud API, і AtomPub до "нормальної" ситуації API). Тому я спробував зробити реалістичний приклад у своєму блозі, який дотримувався порад Роя Філдінга щодо того, що означає бути належним впровадженням REST. Мені було дуже складно придумати цей приклад, незважаючи на те, що він в принципі досить простий (просто заплутаний при роботі з API на відміну від веб-сторінки). Я розумію, що Рой вирішував питання і погоджуюся, це лише зміна настрою для належного впровадження API.

Подивіться: Приклад API за допомогою Rest


4

Єдиним винятком з надання вказівок щодо побудови URI є те, що допустимо надсилати шаблон URI у відповіді гіпертексту з полями, які клієнт автоматично замінює, використовуючи інші поля в гіпертексті. Зазвичай це не дозволяє економити велику пропускну здатність, хоча, оскільки стиснення gzip обробляє повторювані частини URI досить добре, щоб не турбуватися з цим.

Кілька хороших дискусій щодо REST та пов'язаних з цим HATEOAS:

Переваги (також) використання HATEOAS в API RESTFul

Як ОТРИМАТИ чашку кави



4

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


2

Я думаю, що впродовж кількох років, коли REST існує там, технологи змирилися з поняттям Ресурс, і що насправді є чи ні RESTful.

Відповідно до моделі зрілості Річардсона, існують 4 рівні (0-3), які визначають, наскільки RESTful ваш API, причому 3 означають справді API RESTful, точно так, як це задумав Рой Філдінг.

Рівень 0 - це коли у вас є одна точка входу, подібна до URI, як SOAP.

Рівень 1 означає, що API здатний розрізняти різні ресурси і має більше ніж одну точку входу - все ще пахне SOAP.

Рівень 2 - це коли ви використовуєте HTTP-дієслова - GET, POST, DELETE. Це рівень, на якому REST справді з’являється в картині.

На рівні 3 ви починаєте використовувати елементи управління гіпермедіа, щоб зробити ваш API справді RESTful.

Пропоновані посилання для подальшого читання:


1

Абсолютно правильно. Зауважу на додаток, що шаблони URI ідеально підходять у програмі RESTful, якщо зразки є документами, отриманими від сервера (OpenSearch є відповідним прикладом). Для шаблонів URI ви документуєте, де вони використовуються та які очікувані заповнювачі у шаблоні, але не самі шаблони. Трохи всупереч тому, що сказав Ванфріден, це не є винятком.

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

Що стосується вашого запитання: Наша нормативна документація відображає ресурси, вплив різних методів на ці ресурси, типи засобів масової інформації про представлення та їх схеми, а також на те, на які ресурси вказують URI в цих представленнях.

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


1
Добре надати шаблони URI як частину вашого API поза межами діапазону. Просто БУДЬ ЛАСКА не посилайтеся на це як НАЙБІТЬ, бо це не так. Це величезна кількість зчеплення, і саме того, що REST було зроблено, щоб уникнути. Але, як ви кажете, REST не для кожної програми. Тому не претендуйте на те, що кожна програма є ВИПУСКОВОЮ.
aehlke

1
Власне, я згоден. Я вважаю, що це я сказав. Однак я дійсно не бачу жодної вагомої причини для надання шаблонів URI поза межами діапазону.
Кіт Гоген

0

Припустимо, GET /foos/createFormйого викликають для отримання значень полів форми, для яких необхідно надати, коли ми збираємось створити POST /foos. Тепер саме цю URL-адресу, тобто 1, яка використовується для створення foos, слід зазначити у відповіді GET /foos/createFormяк посилання на дію для подання відповідно до пропозиції Філдінга, чи не так?
Тоді яка користь від відображення дій до відомих дієслів Http до дій, річ "домовленість над кодом / конфігурацією" зводиться нанівець.

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