Це хороше і хитре запитання. Тема дизайну URI є водночас найвизначнішою частиною API REST і , отже, потенційно довгостроковою прихильністю до користувачів цього API .
Оскільки еволюція програми та, в меншій мірі, його API є фактом життя і що вона навіть схожа на еволюцію, здавалося б, складного продукту, як мова програмування, дизайн URI повинен мати менші природні обмеження, і його слід зберігати з часом . Чим довший термін служби програми та API, тим більше прихильність до користувачів програми та API.
З іншого боку, ще один факт життя полягає в тому, що важко передбачити всі ресурси та їх аспекти, які були б спожиті через API. На щастя, не потрібно розробляти весь API, який буде використовуватися до апокаліпсису . Достатньо правильно визначити всі кінцеві точки ресурсу та схему адресації кожного ресурсу та ресурсу.
З часом вам може знадобитися додавати нові ресурси та нові атрибути до кожного конкретного ресурсу, але метод, який користувачі API дотримуються для доступу до певних ресурсів, не повинен змінюватися, коли схема адресації ресурсів стає загальнодоступною і, отже, остаточною.
Цей метод застосовується до семантики дієслів HTTP (наприклад, PUT слід завжди оновлювати / замінювати) та кодів статусу HTTP, які підтримуються у попередніх версіях API (вони повинні продовжувати працювати так, щоб клієнти API, які працювали без втручання людини, змогли продовжувати працювати щось схоже на те).
Крім того, оскільки вбудовування версії API в URI порушило б поняття гіпермедіа як двигуна стану додатків (зазначено в кандидатській дисертації Роя Т. Філдінгса), маючи адресу ресурсу / URI, які змінюватимуться з часом, я би зробив висновок, що API версії не повинні зберігатися в URI ресурсів протягом тривалого часу, тобто URI ресурсів, від яких можуть залежати користувачі API, повинні бути постійними посиланнями .
Звичайно, можна вбудувати версію API в базовий URI, але лише для розумних та обмежених застосувань, таких як налагодження клієнта API, який працює з новою версією API. Такі API-версії повинні бути обмеженими часом та доступними лише обмеженим групам користувачів API (наприклад, під час закритих бета-версій). Інакше ти береш себе там, де не повинен.
Кілька думок щодо обслуговування версій API, які мають на них термін придатності. Усі платформи / мови програмування, які зазвичай використовуються для реалізації веб-служб (Java, .NET, PHP, Perl, Rails тощо), дозволяють легко прив’язувати кінцеві точки веб-служб до базового URI. Таким чином легко збирати та зберігати колекцію файлів / класів / методів у різних версіях API .
Із POV користувачами API також простіше працювати та прив’язуватися до певної версії API, коли це очевидно, але лише обмежений час, тобто під час розробки.
З POV, що підтримує API, простіше підтримувати різні версії API паралельно, використовуючи системи управління джерелами, які переважно працюють над файлами як найменша одиниця версії (вихідного коду) версії.
Однак у версіях API, що добре видно в URI, є застереження: можна також заперечити цей підхід, оскільки історія API стає видимою / прозорою у дизайні URI, а отже, схильна до змін у часі, що суперечить вказівкам REST. Я згоден!
Шляхом подолання цього розумного заперечення є реалізація останньої версії API під версією URI без версії API. У цьому випадку розробники клієнтів API можуть вибрати:
розробити проти останнього (зобов’язавшись підтримувати додаток, що захищає його від можливих змін API, які можуть порушити їх погано розроблений клієнт API ).
прив’язати до конкретної версії API (що стає очевидним), але лише на обмежений час
Наприклад, якщо API v3.0 є останньою версією API, наступні два мають бути псевдонімами (тобто поводитись однаково до всіх запитів API):
http: // shonzilla / api / customers / 1234
http: // shonzilla / api /v3.0 / замовники / 1234
http: // shonzilla / api / v3 / customers / 1234
Крім того, клієнтів API, які все ще намагаються вказати на старий API, слід поінформувати про використання останньої попередньої версії API, якщо версія API, яку вони використовують, застаріла або більше не підтримується . Отже, доступ до будь-якого застарілого URI, подібного до цього:
http: // shonzilla / api /v2.2 / замовники / 1234
http: // shonzilla / api /v2.0 / замовники / 1234
http: // shonzilla / api / v2 / замовники / 1234
http: // shonzilla / api /v1.1 / замовники / 1234
http: // shonzilla / api / v1 / замовники / 1234
повинен повернути будь-який з 30x кодів стану HTTP, які вказують на переспрямування , які використовуються разом із Location
заголовком HTTP, який перенаправляє на відповідну версію URI ресурсу, яка залишається такою:
http: // shonzilla / api / замовники / 1234
Існують щонайменше два коди статусу HTTP перенаправлення, які відповідають сценаріям версії API:
301 Переміщено постійно, вказуючи на те, що ресурс із запитуваним URI переміщений назавжди до іншого URI (який повинен бути постійною посиланням на екземпляр ресурсу, що не містить інформації про версію API). Цей код статусу може бути використаний для вказівки застарілої / непідтримуваної версії API, інформуючи клієнта API про те, що URI- версію, що переорієнтований, був замінений на постійну посилання на ресурс .
302 Знайдено, що вказує, що запитуваний ресурс тимчасово знаходиться в іншому місці, хоча запитуваний URI все ще може підтримуватися. Цей код стану може бути корисним, коли URI-файли без версії тимчасово недоступні і запит повинен бути повторений за допомогою адреси перенаправлення (наприклад, вказівка на URI з вбудованою версією APi), і ми хочемо сказати клієнтам продовжувати його використовувати (тобто постійні посилання).
інші сценарії можна знайти в главі перенаправлення 3xx специфікації HTTP 1.1