MS Graph API中的分页

14

图形 API 分页 解释了响应将包含一个字段 @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。

4个回答

34
如果你想要将所有用户放在一个列表里,你可以使用以下代码来实现:
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;
    }

我正在使用图形客户端库


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

谢谢!这正是我们所需要的。 - asgs
有没有办法手动创建下一个链接的URL,因为在我的情况下,参数中有一些Unicode字符,而在点击下一个链接时会抛出错误。 - Bhargav Tavethiya
我该如何获取先前的数据?在分页中,我们也必须提供“上一页”按钮。 - mohit sharma

5
上述代码在最后一行添加对 '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
我按照Tracy的回答,成功一次性获取了所有消息。
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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接