Interfejsy API ReSTful są używane głównie przez inne systemy, dlatego umieszczam dane stronicowania w nagłówkach odpowiedzi. Jednak niektórzy konsumenci API mogą nie mieć bezpośredniego dostępu do nagłówków odpowiedzi lub mogą budować UX na twoim interfejsie API, więc zapewnienie sposobu na odzyskanie (na żądanie) metadanych w odpowiedzi JSON jest plusem.
Uważam, że Państwa implementacja powinna zawierać domyślne metadane odczytywalne komputerowo, a na żądanie - metadane czytelne dla człowieka. Odczytane przez człowieka metadane mogą być zwracane przy każdym żądaniu, jeśli chcesz lub, najlepiej, na żądanie za pomocą parametru zapytania, takiego jak include=metadata
lub include_metadata=true
.
W twoim szczególnym scenariuszu chciałbym dołączyć identyfikator URI dla każdego produktu z zapisem. Ułatwia to konsumentowi API tworzenie linków do poszczególnych produktów. Postawiłbym również pewne rozsądne oczekiwania, zgodnie z limitami moich żądań stronicowania.Wdrażanie i dokumentowanie domyślnych ustawień rozmiaru strony jest akceptowalną praktyką. Na przykład GitHub's API ustawia domyślny rozmiar strony na 30 rekordów z maksymalnie 100, a także ustawia limit szybkości liczby zapytań o API. Jeśli twój interfejs API ma domyślny rozmiar strony, ciąg zapytania może po prostu określać indeks strony.
W scenariuszu czytelnej dla człowieka, kiedy przechodząc do /products?page=5&per_page=20&include=metadata
, odpowiedź może być:
{
"_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"
}
]
}
metadanych do odczytu maszynowego, dodałbym Link headers do odpowiedzi:
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
(wartość nagłówka Link powinna być zakodowana)
... i prawdopodobnie niestandardowy total-count
nagłówka odpowiedzi, jeśli więc wybrać:
total-count: 521
Pozostałe dane przywoławcze ujawnione w metadanych człowieka-centric może być zbędny dla metadanych maszynowego-centric, jako nagłówki Link daj mi znać, na której stronie jestem na a liczba na stronę i mogę szybko pobrać liczbę rekordów w tablicy. Dlatego prawdopodobnie utworzyłbym tylko nagłówek dla całkowitej liczby. Zawsze możesz zmienić zdanie później i dodać więcej metadanych.
Na marginesie możesz zauważyć, że usunąłem /index
z Twojego identyfikatora URI. Ogólnie przyjętą konwencją jest, aby twój punkt końcowy ReST ujawniał kolekcje. Mając /index
na końcu błoto, które się nieznacznie podnosi.
To tylko kilka rzeczy, które lubię mieć podczas używania/tworzenia API. Mam nadzieję, że pomaga!
per_page nie jest zgodna z konwencją page_size –
'" page_count ": 20' i' {"last": "/ products? Page = 26 & per_page = 20"} '? –
co by się stało, gdyby liczba produktów nagle wzrosła podczas pobierania wszystkich rekordów ze strony 1 do strony x? – MeV