API ReSTful споживаються переважно іншими системами, саме тому я розміщую дані підкачки у заголовках відповідей. Однак деякі споживачі API можуть не мати прямого доступу до заголовків відповідей або можуть створювати UX над вашим API, тому надання способу отримання (на вимогу) метаданих у відповіді JSON є плюсом.
Я вважаю, що ваша реалізація повинна включати машиночитані метадані за замовчуванням та читані людиною метадані за запитом. Зчитані людиною метадані можуть бути повернуті з кожним запитом, якщо вам подобається, або, бажано, на вимогу, за допомогою параметра запиту, такого як include=metadata
або include_metadata=true
.
У вашому конкретному сценарії я б включив URI для кожного продукту із записом. Це полегшує споживачеві API створення посилань на окремі продукти. Я б також встановив кілька розумних очікувань відповідно до меж моїх запитів на пейджинг. Впровадження та документування параметрів за замовчуванням для розміру сторінки є прийнятною практикою. Наприклад, API GitHub встановлює розмір сторінки за замовчуванням до 30 записів з максимальною кількістю 100, а також встановлює обмеження швидкості запитів до API. Якщо ваш API має розмір сторінки за замовчуванням, тоді рядок запиту може просто вказати індекс сторінки.
У зручному для читання сценарії під час переходу до /products?page=5&per_page=20&include=metadata
, відповідь може бути:
{
"_metadata":
{
"page": 5,
"per_page": 20,
"page_count": 20,
"total_count": 521,
"Links": [
{"self": "/products?page=5&per_page=20"},
{"first": "/products?page=0&per_page=20"},
{"previous": "/products?page=4&per_page=20"},
{"next": "/products?page=6&per_page=20"},
{"last": "/products?page=26&per_page=20"},
]
},
"records": [
{
"id": 1,
"name": "Widget #1",
"uri": "/products/1"
},
{
"id": 2,
"name": "Widget #2",
"uri": "/products/2"
},
{
"id": 3,
"name": "Widget #3",
"uri": "/products/3"
}
]
}
Для машиночитаних метаданих я б додав заголовки Link до відповіді:
Link: </products?page=5&perPage=20>;rel=self,</products?page=0&perPage=20>;rel=first,</products?page=4&perPage=20>;rel=previous,</products?page=6&perPage=20>;rel=next,</products?page=26&perPage=20>;rel=last
(значення заголовка посилання має бути закодованим)
... і, можливо, спеціальний total-count
заголовок відповіді, якщо ви так вирішите:
total-count: 521
Інші дані підкачки, виявлені в метаданих, орієнтованих на людину, можуть бути зайвими для метаданих, орієнтованих на машину, оскільки заголовки посилань дають мені знати, на якій сторінці я перебуваю, і кількість на сторінці, і я можу швидко отримати кількість записів у масиві . Тому я, мабуть, створив би лише заголовок для загальної кількості. Ви завжди можете передумати згодом і додати більше метаданих.
Окрім того, ви можете помітити, що я видалив /index
ваш URI. Загальновизнаною умовою є надання вашої кінцевої точки ReST колекціям. Маючи /index
в кінці каламутні, що трохи вгору.
Це лише кілька речей, які я люблю мати під час споживання / створення API. Сподіваюся, це допоможе!