在MS Graph API中进行分页

asg*_*sgs 2 pagination azure-ad-graph-api microsoft-graph

图谱API分页说明响应将包含一个字段@odata.nextLink,该字段将包含skiptoken指向下一页内容的字段.

当我测试API时,我得到一个完全限定的MS Graph URL,其中包含skiptoken作为查询参数.例如,下面是我@odata.nextLink在响应JSON中为该字段获得的值. 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.

Rav*_*and 23

如果您想让所有用户都在一个列表中,您可以使用以下代码实现:

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;
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用图形客户端库


Dan*_*SFT 6

是.在Microsoft Graph中,您可以假设您始终可以获得@ odata.nextLink的完全限定URL.您只需使用下一个链接即可获得下一页结果,客户端应将nextLink视为不透明(在OData v4和Microsoft REST API指南中都有描述:https://github.com/Microsoft/ api-guidelines/blob/master/Guidelines.md#98-pagination.
这与AAD Graph API(不是OData v4)不同,它不会返回完全限定的下一个链接,这意味着你需要做更多的事情获得下一页结果的复杂操作.

因此,Microsoft Graph应该让您更加简单.

希望这可以帮助,


Tra*_*acy 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);
        }
Run Code Online (Sandbox Code Playgroud)