API відпочинку - особливі завдання для мобільних пристроїв


25

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

Розроблений API відповідає стилю відпочинку, орієнтованому на ресурси, URI та CRUD-операціям, відображеним на HTTP-дієслова. такі речі, як:

GET www.example.com/books
DELETE www.example.com/books/482094
POST www.example.com/users/6793

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

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

1 екран == 1 виклик API

1 зберегти == 1 виклик API.

Існує багато ситуацій, коли це ставить вас на курс зіткнення з принципами проектування REST, наприклад:

  • скажімо, ваш додаток не працює в режимі офлайн протягом дня, і вам потрібно синхронізувати чотири таблиці резервних баз даних, і вам потрібен дзвінок, як www.example.com/sync_everything?since=2015-07-24
  • Скажімо, є екран, на якому користувач може редагувати багато своїх об'єктів, наприклад, відмічаючи завдання у своєму списку todo. повинен бути спосіб редагувати всі ці записи завдань в одному виклику пакетного API, а не один виклик API за редагування.
  • скажімо, є екран, який змішує інформацію з таблиць ORDER, SALESMEN та PRODUCT, я повинен отримати ці дані за один виклик замість трьох.

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

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

Або будь-яке рішення цієї загальної проблеми. Спасибі!


3
Здається, що ваше запитання може бути таким: "Як API може доставляти колекції об'єктів та вбудованих об'єктів типу або на відміну від них, зберігаючи стиль REST?" Я розумію ваше запитання?
joshp

Я вважаю, що загальна відповідь полягає в тому, що кожен дзвінок REST повинен приймати різні необов'язкові параметри, щоб він міг бути гнучким, але все ще відносно інтуїтивним. Корпус синхронізації завжди буде складним, але для звичайних сторінок ви зазвичай переглядаєте кілька дзвінків одного типу , тобто всі GET, так?
Іксрек

1
Я думаю, що адаптувати ваш API - це неправильне рішення, коли проблема полягає у відсутності паралельних запитів - 8 малих запитів не набагато гірші, ніж один великий запит, коли їм не доведеться чекати один одного. Чи можете ви перейти на HTTP / 2? Або хоча б використовувати протокол HTTP / 1.1?
amon

Дивіться також: Шаблони обробки пакетних операцій у веб-сервісах REST? . Ключ визначає, які типи команд (і за яких передумов) можна об'єднати разом без конфліктів, а потім створити JSON-представлення пакетного порядку, а потім передати його. Він втрачає головну привабливість для REST, а саме - кешируемость, але кешируемость не завжди актуальна для всіх видів програм. Зауважте, що пакет / одночасність не застосовується, якщо існують логічні залежності.
rwong

Аналогія ситуації, коли посереднику необхідно виконувати кілька операцій в послідовності, з нетривіальними логічними залежностями від кожної попередньої операції, є чимось на зразок "збереженої процедури", що виконується в цьому посереднику замість всередині бази даних. Під ним посереднику дозволено перетворити єдиний виклик "збереженої процедури" в стільки запитів RESTful, скільки потрібно, але це детальна інформація про реалізацію посередника.
rwong

Відповіді:


27

Розроблений API відповідає стилю відпочинку, орієнтованому на ресурси, URI та CRUD-операціям, відображеним на HTTP-дієслова.

Це ваша проблема саме тут.

Ви обмежили свої ресурси (я припускаю) моделями у вашій базі даних. Як такий, потрібно завантажувати всі віки для завантаження всіх цих ресурсів, оскільки ваш сервер не має поняття ресурсів, які не мають представлення в базі даних.

Наприклад, можливо

www.example.com/books/482094
www.example.com/books/582045
www.example.com/books/427454
www.example.com/books/319343

що все потрібно завантажити, щоб отримати мою бібліотеку

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

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

Що у вас повинно бути щось таке

www.example.com/users/334/my_library

яка просто завантажує всі книги для цього користувача. "my_library" не є моделлю у вашій базі даних, але це ресурс. Сервер створює його на основі моделей в базі даних, але немає 1-до-1 зіставлення, і сервер має гнучкість для створення цього ресурсу без зміни вашої моделі БД.

Ви також можете мати

www.example.com/users/334/favioured_books
www.example.com/users/334/books_ordered_last_week
www.example.com/users/334/wishlist

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

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

Ресурси повинні бути численними, дешевими та легкими . Створити їх слід легко, і вони повинні бути абстраговані від вашої доменної моделі. Якщо ви виявите, що вам потрібен новий, ви просто зробите новий. Якщо у вас виникли проблеми з тим, що це не ваші рамки, а не REST.

Тепер велике застереження з цим, звичайно, полягає в тому, чи дозволяє ваша рамка це робити. Такі рамки, як Rails і Django, які взяли курс на карту 1 на 1, щоб "заощадити ваш час", ускладнюють це. Але це вада з рамками, а не з RESTful дизайном.

Ось Джим Вебер обговорює це детальніше (включаючи кілька копань на Rails також!)

https://yow.eventer.com/yow-2011-1004/domain-driven-design-for-restful-systems-by-jim-webber-1047


Це дуже цікаво, і я цілком з цим погоджуюся, але, на жаль, я не той, хто робить API, і у мене є мало способів на це вплинути, якщо вони є. Багато людей будуть використовувати цей "антидіапазон" у всьому світі (з багатьох причин, рамкові обмеження є одними), і вони просто використовують визначення URI, щоб чітко продумати свою базу даних. Кінцеві точки API - це лише ще один спосіб візуалізації їх БД ... Крім того, у деяких випадках створити такий ресурс, як описаний вами, важко через те, що об'єкти справді різні, саме їх іменування призведе до дуже невиразних термінів.
MikaelW

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

@MikaelW, ти маєш рацію. Навіть те, що сказав Cormac - це ідеальний сценарій, коли ви працюєте з API, який потребує відвідування багатьох інших систем (настільних, мобільних, веб, запланованих завдань, застарілих систем тощо). Цей тип API повинен бути справді гнучким, забезпечуючи ресурси для відвідування якомога більшої кількості можливостей, але не може відвідувати всі конкретні потреби роботи у одного споживача. У такому випадку у вас не багато варіантів ...
Дерік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.