Останнім часом я проводив обширне дослідження цього та інших питань, пов’язаних з ПЕСТ-сторінками, і вважаю, що це додати тут деякі мої висновки. Я трохи розширюю питання, щоб включити думки про пейджинговий зв’язок, а також про кількість підрахунків, оскільки вони тісно пов'язані.
Заголовки
Метадані підкачки включаються у відповідь у формі заголовків відповідей. Велика перевага цього підходу полягає в тому, що сам корисний набір відповіді - це саме той запитувач, про який запитував. Полегшити обробку відповіді клієнтам, які не цікавляться інформацією про підкачку.
Існує купа (стандартних та користувацьких) заголовків, які використовуються в дикій природі для повернення інформації, пов’язаної з підказками, включаючи загальну кількість.
X-Total-Count
X-Total-Count: 234
Це використовується в деяких API, які я знайшов у дикій природі. Існують також пакети NPM для додавання підтримки цього заголовка, наприклад, Loopback. У деяких статтях також рекомендується встановити цей заголовок.
Його часто використовують у поєднанні із Link
заголовком, що є досить хорошим рішенням для підкачки, але не вистачає загальної інформації про кількість.
Посилання
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
Від читання з цього приводу я відчуваю, що загальна консенсус полягає у використанні Link
заголовка для надання посилань на підключення до клієнтів, які використовують rel=next
, rel=previous
і т.д. чому багато API поєднують це із X-Total-Count
заголовком.
Крім того, деякі API та, наприклад, стандарт JsonApi , використовують Link
формат, але додають інформацію в конверт відповідей замість заголовка. Це спрощує доступ до метаданих (і створює місце для додавання загальної інформації про кількість) за рахунок збільшення складності доступу до власне даних (додаючи конверт).
Контент-діапазон
Content-Range: items 0-49/234
Промотувана статтею блогу під назвою Заголовок діапазону, я вибираю вас (для пагінації)! . Автор робить вагомий аргумент для використання заголовків Range
і Content-Range
заголовків для сторінки. Коли ми уважно прочитаємо в RFC на ці заголовки, ми знаходимо , що розширення їх значення за межі діапазонів байтів фактично порочить RFC і явно дозволені. При використанні в контексті items
замість цього bytes
, заголовок Діапазону насправді дає нам можливість запитувати певний діапазон елементів та вказувати, до якого діапазону загального результату відносяться елементи відповіді. Цей заголовок також дає чудовий спосіб показати загальну кількість. І це справжній стандарт, який здебільшого відображає один на один на пейджингові. Також використовується в дикій природі .
Конверт
Багато API, в тому числі і наш улюблений веб-сайт Q&A, використовують конверт , обгортку навколо даних, яка використовується для додавання метаінформації про дані. Також стандарти OData та JsonApi використовують конверт відповідей.
Великий недолік цього (imho) полягає в тому, що обробка даних відповідей стає складнішою, оскільки фактичні дані потрібно знайти десь у конверті. Також існує багато різних форматів для цього конверта, і ви повинні використовувати правильний. Це говорить про те, що конверти відповідей від OData та JsonApi дико відрізняються, і OData змішується у метаданих у кількох точках відповіді.
Окрема кінцева точка
Я думаю, що це досить висвітлено в інших відповідях. Я не дуже досліджував це, бо погоджуюся з коментарями, що це заплутано, оскільки зараз у вас є кілька типів кінцевих точок. Я думаю, що найприємніше, якщо кожна кінцева точка являє собою (колекцію) ресурсів.
Подальші думки
Нам потрібно не лише передавати метаінформацію підкачки, пов'язану з відповіддю, але також дозволяти клієнту запитувати конкретні сторінки / діапазони. Цікаво також подивитися на цей аспект, щоб закінчити цілісне рішення. І тут ми можемо використовувати заголовки ( Range
заголовок здається дуже підходящим) або інші механізми, такі як параметри запиту. Деякі люди виступають за обробку сторінок результатів , як окремі ресурси, які можуть мати сенс в деяких випадках використання (наприклад /books/231/pages/52
, я в кінцевому підсумку вибір дикого діапазону часто використовуваних параметри запиту , такі як pagesize
, page[size]
і limit
т.д. , в доповненні до підтримки Range
заголовка (і в якості параметра запиту також).