MS Graph API 中的分页

问题描述 投票:0回答:4

Graph API Paging 解释了响应将包含一个字段

@odata.nextLink
,其中包含指向下一页内容的
skiptoken

当我测试 API 时,我得到了一个完全限定的 MS Graph URL,其中包含

skiptoken
作为查询参数。例如。下面是我在响应 JSON 中获得的字段
@odata.nextLink
的值。
https://graph.microsoft.com/v1.0/users?$top=25&$skiptoken=X%27445370740200001E3A757365723134406F33363561702E6F6E6D6963726F736F66742E636F6D29557365725F31363064343831382D343162382D343961372D383063642D653136636561303437343437001E3A7573657235407368616C696E692D746573742E31626F74322E696E666F29557365725F62666639356437612D333764632D343266652D386335632D373639616534303233396166B900000000000000000000%27

可以安全地假设我们总是会获得完整的 URL 而不仅仅是

skiptoken
吗?因为如果这是真的,它有助于避免解析
skiptoken
然后将其连接到现有 URL 以形成完整的 URL。

编辑 - 与 MS Graph API 相比,从 Azure AD Graph API 获取的响应的不同之处在于 JSON 字段

@odata.nextLink
仅包含
skipToken
而不是完全限定的 URL。

pagination microsoft-graph-api azure-ad-graph-api
4个回答
35
投票

如果您希望所有用户都在单个列表中,您可以使用以下代码来实现:

public static async Task<IEnumerable<User>> GetUsersAsync()
    {
        var graphClient = GetAuthenticatedClient();
        List<User> allUsers = new List<User>();
        var users = await graphClient.Users.Request().Top(998)
           .Select("displayName,mail,givenName,surname,id")
           .GetAsync();

        while (users.Count > 0)
        {
            allUsers.AddRange(users);
            if (users.NextPageRequest != null)
            {
                users = await users.NextPageRequest
                    .GetAsync();
            }
            else
            {
                break;
            }
        }
        return allUsers;
    }

我正在使用图形客户端库


17
投票

是的。在 Microsoft Graph 中,您可以假设您始终会获得 @odata.nextLink 的完全限定 URL。您可以简单地使用下一个链接来获取下一页结果,客户端应将下一个链接视为不透明(OData v4 和 Microsoft REST API 指南中对此进行了描述:https://github.com/Microsoft /api-guidelines/blob/master/Guidelines.md#98-pagination.
这与 AAD Graph API(不是 OData v4)不同,后者不会返回完全限定的下一个链接,这意味着您需要执行一些更复杂的操作才能获取下一页结果。

因此 Microsoft Graph 应该会让您变得更简单。

希望这有帮助,


6
投票

如果不在最后一行添加对“CurrentPage”的调用,上面的代码对我不起作用。
样本从这里采集。

        var driveItems = new List<DriveItem>();
        var driveItemsPage = await graphClient.Me.Drive.Root.Children.Request().GetAsync();
        driveItems.AddRange(driveItemsPage.CurrentPage);
        while (driveItemsPage.NextPageRequest != null)
        {
            driveItemsPage = await driveItemsPage.NextPageRequest.GetAsync();
            driveItems.AddRange(driveItemsPage.CurrentPage);
        }

0
投票

我按照特雷西的回答,我能够一次性获取所有消息。

public List<Message> GetMessages()
{
    var messages = new List<Message>();
    
    var pages = Client.Users[_email]
                      .Messages
                      .Request(QueryOptions)
                      // Fetch the emails with attachments directly instead of downloading them later.
                      .Expand("attachments")
                      .GetAsync()
                      .Result;

    messages.AddRange(pages.CurrentPage);

    while (pages.NextPageRequest != null)
    {
        pages = pages.NextPageRequest.GetAsync().Result;
        messages.AddRange(pages.CurrentPage);
    }

    return messages;
}
© www.soinside.com 2019 - 2024. All rights reserved.