Handle Pagination in API responses
mainDigitalOcean API results are often paginated. There are two main patterns for handling this:
1. Page-based Pagination
Used by endpoints like Droplets.List. You iterate using ListOptions and check resp.Links.IsLastPage(). To get the next page, use resp.Links.CurrentPage() and increment the opt.Page value.
2. Token-based Pagination
Used by endpoints like Registry.ListRepositoriesV2. You iterate using TokenListOptions. Instead of an integer page number, you retrieve the next token via resp.Links.NextPageToken() and assign it to opt.Token for the subsequent request.
// Example: Page-based pagination for Droplets
opt := &godo.ListOptions{}
for {
droplets, resp, err := client.Droplets.List(ctx, opt)
if err != nil {
return nil, err
}
list = append(list, droplets...)
if resp.Links == nil || resp.Links.IsLastPage() {
break
}
page, err := resp.Links.CurrentPage()
if err != nil {
return nil, err
}
opt.Page = page + 1
}
// Example: Token-based pagination for Registry
opt := &godo.TokenListOptions{}
for {
repositories, resp, err := client.Registry.ListRepositoriesV2(ctx, registryName, opt)
if err != nil {
return nil, err
}
list = append(list, repositories...)
if resp.Links == nil || resp.Links.IsLastPage() {
break
}
nextPageToken, err := resp.Links.NextPageToken()
if err != nil {
return nil, err
}
opt.Token = nextPageToken
}