Pagination MS-graphapi中的分页

Pagination MS-graphapi中的分页,pagination,microsoft-graph-api,azure-ad-graph-api,Pagination,Microsoft Graph Api,Azure Ad Graph Api,说明响应将包含一个字段@odata.nextLink,该字段将包含一个指向下一页内容的skiptoken 当我测试API时,我得到一个完全限定的MS Graph URL,其中包含skiptoken作为查询参数。例如,下面是我为响应JSON中的字段@odata.nextLink获取的值。 https://graph.microsoft.com/v1.0/users?$top=25和$skiptoken=X%274453707402000001E3A757365723134406F333635617

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

当我测试API时,我得到一个完全限定的MS Graph URL,其中包含
skiptoken
作为查询参数。例如,下面是我为响应JSON中的字段
@odata.nextLink
获取的值。
https://graph.microsoft.com/v1.0/users?$top=25和$skiptoken=X%274453707402000001E3A757365723134406F33363561702E6D696326F736F66742E636F6D29557365725F313643831382D3433162382D3433961372D3833063642D651366363636363303434343437001EA75736572354073616C696E692E666D746573742E66666F29536572F6256636363565F6262625676767676763636363636363636363636363636366F626262666666363636363636363636363636363636363636363636363636363636363636363632D373639616534303233396166B90000000000000000000%27

假设我们总是得到完整的URL,而不仅仅是
skiptoken
,这样安全吗?因为如果这是真的,它有助于避免解析
skiptoken
,然后将其连接到现有URL以形成完整的URL


EDIT-与MS Graph API相比,从Azure AD Graph API获得的响应不同之处在于JSON字段
@odata.nextLink
仅包含
skipToken
,而不包含完全限定的URL。

是。在MicrosoftGraph中,您可以假定您始终会获得@odata.nextLink的完全限定URL。您只需使用下一个链接即可获得下一页的结果,客户端应将下一个链接视为不透明的(这在OData v4和Microsoft REST API指南中都有描述:。
这与AAD Graph API(不是OData v4)不同,后者不会返回完全限定的下一个链接,这意味着您需要执行一些更复杂的操作才能获得下一页的结果

因此,MicrosoftGraph应该会让您更简单


希望这有帮助,

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

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;
    }
公共静态异步任务GetUsersAsync()
{
var graphClient=GetAuthenticatedClient();
List allUsers=新列表();
var users=wait graphClient.users.Request().Top(998)
.选择(“displayName、mail、givenName、姓氏、id”)
.GetAsync();
而(users.Count>0)
{
allUsers.AddRange(用户);
if(users.NextPageRequest!=null)
{
users=等待users.NextPageRequest
.GetAsync();
}
其他的
{
打破
}
}
回归诱惑;
}

我正在使用

如果没有在最后一行添加对“CurrentPage”的调用,上述代码对我无效。
取样

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

谢谢!这正是我们需要的。我们是否可以手动创建下一个链接URL,因为在我的例子中,params有一些Unicode字符,在点击下一个链接时会抛出错误。如何获取上一个数据?在分页中,我们还必须提供“上一个”按钮。
        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);
        }