Останнім часом я проводив обширне дослідження цього та інших питань, пов’язаних з ПЕСТ-сторінками, і вважаю, що це додати тут деякі мої висновки. Я трохи розширюю питання, щоб включити думки про пейджинговий зв’язок, а також про кількість підрахунків, оскільки вони тісно пов'язані.
Заголовки
Метадані підкачки включаються у відповідь у формі заголовків відповідей. Велика перевага цього підходу полягає в тому, що сам корисний набір відповіді - це саме той запитувач, про який запитував. Полегшити обробку відповіді клієнтам, які не цікавляться інформацією про підкачку.
Існує купа (стандартних та користувацьких) заголовків, які використовуються в дикій природі для повернення інформації, пов’язаної з підказками, включаючи загальну кількість.
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заголовка (і в якості параметра запиту також).