abudwill | 2024-07-12 20:32:47 UTC | #1
Hello,
I am using the Platform SDK/.Net.
What methodology should I use to handle paginated results for API call results?
Reading posts and examining documentation, I have seen a number of different approaches.
I have been relying on nextUri being provided. I have discovered in some instances nextUri isn't incldued in the response. Using the API explorer I can demonstrate this with GET /api/v2/routing/skills and GET /api/v2/flows/datatables (output shown below). In this example I have explicitly defined the page number and made the page size 2 so that results below are minimal (mentioning this because it might seem strange). In the GET datatables response, no nextUri is present.
I suppose I could also just increase the page number until I don't see anything return in entities. I wanted to get feedback from others on how they have handled this.
[code] GET /api/v2/routing/skills?pageSize=2&pageNumber=1 HTTP/1.1 Host: api.mypurecloud.com Authorization: Bearer ******* Content-Type: application/json [/code]
[code] { "entities": [ { "id": "[redacted]", "name": "[redacted]", "dateModified": "2023-02-23T06:54:59Z", "state": "active", "version": "1", "selfUri": "/api/v2/routing/skills/[redacted]" }, { "id": "[redacted]", "name": "[redacted]", "dateModified": "2023-02-23T06:55:44Z", "state": "active", "version": "1", "selfUri": "/api/v2/routing/skills/[redacted]" } ], "pageSize": 2, "pageNumber": 1, "total": 182, "lastUri": "/api/v2/routing/skills?pageSize=2&pageNumber=91", "firstUri": "/api/v2/routing/skills?pageSize=2&pageNumber=1", "selfUri": "/api/v2/routing/skills?pageSize=2&pageNumber=1", "nextUri": "/api/v2/routing/skills?pageSize=2&pageNumber=2", "pageCount": 91 } [/code]
[code] GET /api/v2/flows/datatables?pageNumber=1&pageSize=2 HTTP/1.1 Host: api.mypurecloud.com Authorization: Bearer ******* Content-Type: application/json [/code]
[code] { "entities": [ { "id": "[redacted]", "name": "[redacted]", "division": { "id": "[redacted]", "name": "Home", "selfUri": "/api/v2/authorization/divisions/[redacted]" }, "selfUri": "/api/v2/flows/datatables/[redacted]" }, { "id": "[redacted]", "name": "[redacted]", "division": { "id": "[redacted]", "name": "Home", "selfUri": "/api/v2/authorization/divisions/[redacted]" }, "description": "[redacted]", "selfUri": "/api/v2/flows/datatables/[redacted]" } ], "pageSize": 2, "pageNumber": 1, "total": 163, "pageCount": 82 } [/code]
Eos_Rios | 2024-07-12 21:00:21 UTC | #2
I use a generic function to iterate most of them and convert them into a consolidated list locally;
list.AddRange(entity.Entities); // Add to the local List
// We have to cast PageCount to an int? because the dynamic recasts it to an int somehow and we have to confirm it has a value before we act on it.
if (((int?)entity.PageCount).HasValue && entity.PageCount > 1) // Let's get paging.
{
int pageSize = entity.PageSize; // in case the API lowers the answer, we have to adjust
int pageCount = entity.PageCount;
for (int page = 2; page <= pageCount; page++)
{
Thread.Sleep(1000);
entity = method.Invoke(api, new object[] { pageSize, page });
list.AddRange(entity.Entities); // Append
}
}
return list;
But you can see it's basically run the Get once, if it has a PageCount higher than one ask for the next until we get through the last page, per suggestion #1
You can see in your own example you could expect 91 pages at that pageSize.
More APIs seem to support that way than the NextUri method.
abudwill | 2024-07-17 10:12:59 UTC | #3
Thanks, will use this methodology going forward.
system | 2024-08-16 10:13:08 UTC | #4
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
This post was migrated from the old Developer Forum.
ref: 27232