Pagination
Une page, toutes les pages, ou un élément à la fois.
Une page
var page = await client.Threads.ListAsync(folder: "inbox", limit: 25); foreach (var thread in page){ Console.WriteLine(thread["id"]);} if (page.HasMore){ var next = await client.Threads.ListAsync(folder: "inbox", limit: 25, cursor: page.NextCursor); Console.WriteLine(next.Count);}Une méthode ListAsync renvoie une Page avec Items, HasMore et NextCursor, et foreach parcourt ses éléments. Repassez NextCursor comme cursor:, avec les mêmes filtres, pour lire la page suivante.
Toutes les pages
var failed = await client.Emails.ListAllAsync(status: new[] { "failed" }); Console.WriteLine($"{failed.Count} messages failed");Une méthode ListAllAsync suit le curseur jusqu'au bout et renvoie tous les éléments dans une seule liste. Un échec sur une page fait échouer tout l'appel.
Un élément à la fois
await foreach (var contact in client.Contacts.IterateAsync(limit: 100)){ if ((string?)contact["email"] == "[email protected]") { break; }} await foreach (var entry in client.Emails.IterateEventsAsync("msg_3f9a1c07d2b84e6a9c5b1f20")){ Console.WriteLine(entry["type"]);}Une méthode IterateAsync renvoie un IAsyncEnumerable<JsonObject>, qui ne demande la page suivante que lorsque la boucle y arrive : un break arrête donc les requêtes. Chaque liste paginée a les trois, nommées d'après la liste qu'elles parcourent : ListAllEventsAsync et IterateEventsAsync à côté de ListEventsAsync.
Un parcours s'arrête quand l'API répète un curseur qu'il a déjà suivi : il ne peut donc jamais tourner sans fin.