ReSTful API są używane głównie przez inne systemy, dlatego dane stronicowania umieszczam 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 za pośrednictwem interfejsu API, więc zapewnienie sposobu pobierania (na żądanie) metadanych w odpowiedzi JSON jest plusem.
Uważam, że Twoja implementacja powinna domyślnie zawierać metadane do odczytu maszynowego oraz metadane czytelne dla człowieka na żądanie. Czytelne dla człowieka metadane mogą być zwracane z każdym żądaniem, jeśli chcesz, a najlepiej na żądanie za pośrednictwem parametru zapytania, takiego jak include=metadata
lub include_metadata=true
.
W twoim konkretnym scenariuszu dołączyłbym identyfikator URI dla każdego produktu z rekordem. Ułatwia to konsumentowi API tworzenie linków do poszczególnych produktów. Ustawiłbym również rozsądne oczekiwania, jeśli chodzi o limity moich żądań stronicowania. Wdrażanie i dokumentowanie domyślnych ustawień rozmiaru strony jest dopuszczalną praktyką. Na przykład interfejs API GitHub ustawia domyślny rozmiar strony na 30 rekordów z maksymalnie 100, a także ustawia limit szybkości dotyczący liczby zapytań interfejsu 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 czytelnym dla człowieka, podczas nawigowania do /products?page=5&per_page=20&include=metadata
, odpowiedzią 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"
}
]
}
W przypadku metadanych do odczytu maszynowego dodałbym do odpowiedzi nagłówki linków :
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 linku powinna mieć kod urlencoded)
... i ewentualnie niestandardowy total-count
nagłówek odpowiedzi, jeśli wybierzesz:
total-count: 521
Inne dane stronicowania ujawnione w metadanych zorientowanych na człowieka mogą być zbędne w przypadku metadanych zorientowanych na komputer, ponieważ nagłówki linków informują mnie, na której stronie jestem i jaka jest liczba na stronie, a także mogę szybko pobrać liczbę rekordów w tablicy . Dlatego prawdopodobnie utworzyłbym tylko nagłówek dla całkowitej liczby. Zawsze możesz później zmienić zdanie i dodać więcej metadanych.
Na marginesie, możesz zauważyć, że usunąłem /index
Twój identyfikator URI. Ogólnie przyjętą konwencją jest udostępnianie kolekcji w punkcie końcowym ReST. Mając /index
na muddies końcowych, które się nieznacznie.
To tylko kilka rzeczy, które lubię mieć podczas używania / tworzenia API. Mam nadzieję, że to pomoże!