Який правильний спосіб зробити REST?


36

Всі сьогодні роблять SOA , навіть якщо деякі насправді не розуміють, про що йдеться. Так вони роблять неправильно. Використовуючи це як аналогію, я знаю, що таке REST (або, принаймні, я думаю, що це роблю), і хочу зробити щось з цього. Але я хочу зробити це правильно.

Тож моє запитання - який правильний спосіб зробити REST?


1
Вікі тегів "Переповнений" стека здається настільки ж близькими, як і до канонічного ресурсу в контексті мережі Stack Exchange
gnat

17
Я просто заплющив очі на деякий час ... можливо, поїду на велосипеді, а потім ліг.
Едвард Странд

Хіба REST в основному не використовується лише таким URL-адресом, як mydomain.com/accounts та HTTP-дієслово для виклику операції? Де дієслово вказує, чи потрібно отримувати, створювати, оновлювати чи видаляти дані? Коли я думаю, що REST - це те, про що я думаю.
Людина-булочка

2
@ Нік, це найпоширеніша інтерпретація, "справжню річ" набагато важче підробляти, і (наскільки я можу сказати) набагато важче знайти насправді реалізовану будь-де ... (див. Відповідь
Вілка

3
@Nick ваше розуміння не REST, це RPC через HTTP .

Відповіді:


30

Ну, існує багато способів дізнатися, як створити RESTful веб-додаток, і немає, не існує єдиного правильного способу. RESTful не є стандартом, але він використовує набір стандартів (HTTP, URI, Mime Type, ...).

Почніть з цього: Як я пояснив REST дружині

Потім приступайте до цього: « RESTful Cook Services»

А потім докладіть усіх зусиль для розробки веб-додатків, оскільки найкращий спосіб вчитися - це робити експерименти, і ви можете так багато навчитися зі своїх помилок;)

Не хвилюйтесь, якщо ваші перші веб-додатки не будуть повністю ВИПУСКними: ви знайдете спосіб це зробити!

Тож, цитуючи Оби-Вана Кенобі, "може, сила буде з вами!" ;)

EDIT

Добре, дозвольте бути більш конкретним. Ви хочете зробити якийсь ВІДПОВІДНИЙ webapp, так? Ну, як я вже сказав, є багато способів зробити це, але це головне керівництво.

Визначення

REST (Представницький стан передачі) - це стиль архітектури програмного забезпечення для розподіленої системи (наприклад, WWW). Це не стандарт, але він використовує набір стандартів: HTTP, AJAX, HTML, URI, Mime Type тощо. Ми говоримо про представлення ресурсу, а не про сам ресурс. Взято з "Як я пояснив REST дружині":

Дружина : веб-сторінка - це ресурс?

Райан : Види . Веб-сторінка - це представлення ресурсу. Ресурси - це лише поняття.

Обмеження архітектури

  • Клієнт-сервер : клієнт і сервер розділені Уніфікованим інтерфейсом (описано нижче).
  • Без громадянства : спілкування сервер-клієнт здійснюється без збереження певного стану клієнта на сервері.
  • Cachable : клієнт може мати кеш відповідей на вже зроблені запити.
  • Багатошарова система : клієнт не знає, чи він безпосередньо пов’язаний з кінцевим сервером, чи зв’язок здійснюється через проміжні продукти.

Уніфікований інтерфейс

  • Ідентифікація ресурсів: кожен ресурс повинен бути ідентифікований URI.
  • Протокол : для того, щоб увійти в комунікаційний клієнт і сервер, слід зробити протокол раніше. Кожен запит може мати правильний тип MIME (application / xml, text / html, application / rdf + xml тощо), праві заголовки та правильний метод HTTP (див. Опис CRUD нижче).

CRUD

Гаразд, ми бачили, що для ідентифікації ресурсів ми можемо використовувати URI, але нам потрібні щось інше для дій (додавання, зміна, видалення тощо): чудовий прийом до CRUD (Створення, читання, оновлення та видалення).

  • Створіть { HTTP: POST } { SQL: INSERT } => створіть новий ресурс
  • Прочитайте { HTTP: GET } { SQL: SELECT } => отримати ресурс
  • Оновіть { HTTP: PUT } { SQL: UPDATE } => змінити ресурс
  • Видалити { HTTP: DELETE } { SQL: DELETE } => видалити ресурс

Тепер щодо PUT і DELETE можуть з’явитися деякі технічні проблеми (ви отримаєте їх у формі HTML): розробники часто обходять цю проблему, використовуючи POST для кожного запиту "PUT" та "DELETE". Офіційно вам потрібно використовувати PUT і DELETE. До речі, роби те, що хочеш. Мій досвід підштовхує мене щоразу використовувати POST та GET.

--- Наступна частина повинна бути використана, але це не зв'язок REST: стосується пов'язаних даних ---

URI

Абстрактний URI з технічних деталей! Попрощайтеся з URI так:

http://www.example.com/index.php?query=search&id=9823&date=08272012

Переконструюйте URI! Візьміть посилання вище та змініть його так:

http://www.example.com/search/2012/08/27/9823

Це набагато краще, так? Це можна зробити:

Інша справа: використовуйте різні URI для представлення різних ресурсів:

Зверніть увагу : about.html і about.rdf - це не файли! Вони можуть бути результатом перетворення XSLT!

Зміст переговорів

Якщо ви досягли цього пункту, вітаю! Ймовірно, ви готові отримати більш абстрактні поняття, оскільки ми вносимо технічні деталі веб-семантики;) Ну, коли ваш клієнт хоче ресурс, він зазвичай робить такий запит:

GET http://www.example.com/about
Accept: application/rdf+xml

Але сервер не відповість разом з about.rdf, оскільки він має інший URI ( http://www.example.com/about.rdf ). Отже, давайте подивимось на шаблон 303 ! Сервер поверне це:

303 See Other
Location: http://www.example.com/about.rdf

І клієнт перейде за посиланням, що повертається таким чином:

GET http://www.example.com/about.rdf
Accept: application/rdf+xml

Нарешті, сервер поверне запитуваний ресурс:

200 OK
about.rdf

Не хвилюйтесь: ваша клієнтська програма нічого з цього не зробить! Шаблон 303 повинен бути виконаний серверною програмою, а ваш браузер зробить все інше;)

Висновок

Часто теорія знаходиться далеко, далеко від практики. Так, тепер ви знаєте, як створити та розробити додаток RESTful, але наведені вище рекомендації - лише натяк. Ви знайдете найкращий спосіб створення веб-додатків і, ймовірно, це не буде таким, як хоче теорія. Не кажи на це чорт: D!

Бібліографія

RESTful веб-сервіси, Sameer Tiagi

API REST повинен керуватися гіпертекстом, Рой Томас Філдінг

RESTful Веб-сервіси: Основи, Алекс Родрігес

Веб-робочий процес REST


1
Ви можете розглянути можливість додавання цього посилання , яке є найповнішим посібником, з яким я потрапив.
Benjol

Я бачив, як PUT і POST використовуються із змінами їх значень (стосовно вашої відповіді): POST -> create, PUT -> update. Будь-яка ідея, яке значення ширше використовується?
Андрес Ф.

@Andres F .: jcalcote.wordpress.com/2008/10/16/… говорить: Створити = PUT iff, якщо ви надсилаєте повний вміст вказаного ресурсу (URL). Create = POST, якщо ви надсилаєте команду серверу для створення підпорядкованого зазначеного ресурсу, використовуючи деякий алгоритм на стороні сервера. Update = PUT iff, якщо ви оновлюєте повний вміст зазначеного ресурсу. Оновлення = POST, якщо ви вимагаєте від сервера оновити одного або декількох підлеглих вказаного ресурсу.
Вілк

@Benjol: Я збираюся редагувати з вашою пропозицією;) Дякую!
Вілк

1
@Wilk Деякі багато речей, які слід врахувати! Напевно, чому ніхто не отримує цього права: Р
Андрес Ф.

5

РЕСТОВА біблія або щось таке ....

Біблійна книга не потрібна; У мене були такі ж точні запитання, і я дізнався все, що мені потрібно чи хотів дізнатися про REST, прочитавши ці три статті:

  1. Вступ початківців до HTTP та REST від Net Tuts +
  2. RESTful веб-сервіси: основи IBM developerWorks
  3. RESTful HTTP на практиці від InfoQ

Але я хочу зробити це правильно.

Як ви читаєте у наведених вище статтях, головним є розгляд доступних фрагментів вашої програми як "ресурсів", які можна створити, отримати, оновити або видалити за допомогою існуючих HTTP "дієслів": GET, PUT, POST , УДАЛИТИ.

Також знайте різницю між PUT та POST та коли їх використовувати. GET, PUT і DELETE повинні бути безвідмовними транзакціями, POST не повинен.

Також належним чином використовуйте коди статусу HTTP під час спілкування з клієнтом.

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