Las API ReSTful son consumidas principalmente por otros sistemas, por lo que pongo datos de paginación en los encabezados de respuesta. Sin embargo, algunos consumidores API pueden no tener acceso directo a los encabezados de respuesta, o pueden construir un UX sobre su API, por lo que proporcionar una forma de recuperar (a petición) los metadatos en la respuesta JSON es una ventaja.
Creo que su implementación debe incluir metadatos legibles por máquina de manera predeterminada y metadatos legibles por humanos cuando se soliciten. Los metadatos legibles por humanos se pueden devolver con cada solicitud si lo desea o, preferiblemente, a pedido a través de un parámetro de consulta, como include=metadata
o include_metadata=true
.
En su situación particular, incluiría el URI para cada producto con el registro. Esto facilita que el consumidor API cree enlaces a los productos individuales. También establecería algunas expectativas razonables según los límites de mis solicitudes de búsqueda.Implementar y documentar configuraciones predeterminadas para el tamaño de página es una práctica aceptable. Por ejemplo, GitHub's API establece el tamaño de página predeterminado en 30 registros con un máximo de 100, además establece un límite de velocidad en la cantidad de veces que puede consultar la API. Si su API tiene un tamaño de página predeterminado, entonces la cadena de consulta solo puede especificar el índice de página.
En el escenario legible por humanos, cuando se navega a /products?page=5&per_page=20&include=metadata
, la respuesta podría ser:
{
"_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"
}
]
}
Por metadatos legibles por máquina, añadiría Link headers a la respuesta:
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
(El valor del encabezado del enlace debe ser urlencoded)
... y posiblemente unpersonalizadocabecera de la respuesta, si así lo desea:
total-count: 521
Los otros datos de localización reveladas en los metadatos humanocentrista podrían ser superfluas para los metadatos máquina centradas, como las cabeceras de enlace que me haga saber qué página estoy encendido y el número por página, y puedo recuperar rápidamente el número de registros en la matriz. Por lo tanto, probablemente solo crearía un encabezado para el recuento total. Siempre puede cambiar de parecer más adelante y agregar más metadatos.
Como nota aparte, puede observar que eliminé /index
de su URI. Una convención generalmente aceptada es tener sus colecciones de exposición de puntos finales ReST. Al tener /index
al final se ensucia un poco.
Estas son solo algunas cosas que me gusta tener al consumir/crear una API. ¡Espero que ayude!
per_page no sigue la convención page_count –
'" page_count ": 20' y' {"last": "/ products? Page = 26 & per_page = 20"} '? –
¿qué pasaría si el conteo del producto aumenta repentinamente mientras se obtienen todos los registros de la página 1 a la página x? – MeV