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
假设我们始终获得完整的网址而不仅仅是skiptoken
,这是否安全?因为如果它是真的,它有助于避免解析skiptoken
,然后将其连接到现有的URL以形成完整的URL。
编辑 - 与MS Graph API相比,从Azure AD Graph API获取的响应的不同之处在于,JSON字段@odata.nextLink
仅包含skipToken
而非完全限定URL。
答案 0 :(得分:5)
是。在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应该让您更加简单。
希望这有帮助,
答案 1 :(得分:0)
如果要将所有用户都放在一个列表中,可以通过以下方法实现:
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;
}
我正在使用graph client library
答案 2 :(得分:0)
如果没有在最后一行添加对“CurrentPage”的调用,上面的代码对我不起作用。
取样from here。
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);
}