Tags: #pagination #design
We use pagination to request specific segments of a dataset from an API (and a database) instead of everything at once.
The use of offset-based pagination requires passing:
Offsets allow page-specific features, and are simple to implement and use.
[!WARNING] Offsets create database performances issues:
- Page 1: offset = 0, limit = 100, reads and returns 100 records
- Page 2: offset = 100, limit = 100, reads 200 records, returns 100 records
/* First request */
/services?filter[customer_id]=123&page[number]=1&page[size]=500
/* Response */
“data” : [,...],
“meta”: {
"current_page": 1,
"per_page": 500,
"record_count": 1133,
"total_pages": 3
}
/* Next request */
/services?filter[customer_id]=123&page[number]=2&page[size]=500
The use of cursor-based pagination requires passing:
The response will include:
And subsequent request will pass such cursor:
[!NOTE] *example identifiers
/* First request */
/services?filter[customer_id]=123&limit=500
/* Response */
“data” : [,…],
“meta”: {
"next_cursor": “1tkSVoL9b7VAvdIhad9aH8”,
"limit": 500
}
/* Next request */
/services?filter[customer_id]=123&limit=500&cursor=1tkSVoL9b7VAvdIhad9aH8
[!IMPORTANT] Cursor-based pagination provides a consistent query time, ideal for vast and changing datasets, and excluding total count and number of pages makes the performance optimization even more significative.
/* Count request */
/services?filter[customer_id]=123&total=true
/* Response */
“data” : [],
“meta”: {
"total": 1113
}