MS Graph 中的分页 API
Paging in MS Graph API
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 我们自己。
EDIT - 与 MS Graph API 相比,从 Azure AD Graph API 获得的响应的不同之处在于 JSON 字段 @odata.nextLink
仅包含 skipToken
而不是完全限定的 URL.
是的。在 Microsoft Graph 中,您可以假设您将始终获得 @odata.nextLink 的完全限定 URL。您可以简单地使用 next link 来获取下一页结果,客户端应该将 nextLink 视为不透明的(OData v4 和 Microsoft REST API 指南中均对此进行了描述:https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#98-pagination.
这不同于 AAD Graph API(它不是 OData v4),它没有 return 完全合格的下一个 link,这意味着您需要进行一些更复杂的操作才能获得下一页结果。
因此 Microsoft Graph 应该会为您简化此操作。
希望对您有所帮助,
如果您希望所有用户都在一个列表中,您可以使用以下代码实现:
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
如果没有在最后一行添加对 '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);
}
我按照 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;
}
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 我们自己。
EDIT - 与 MS Graph API 相比,从 Azure AD Graph API 获得的响应的不同之处在于 JSON 字段 @odata.nextLink
仅包含 skipToken
而不是完全限定的 URL.
是的。在 Microsoft Graph 中,您可以假设您将始终获得 @odata.nextLink 的完全限定 URL。您可以简单地使用 next link 来获取下一页结果,客户端应该将 nextLink 视为不透明的(OData v4 和 Microsoft REST API 指南中均对此进行了描述:https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#98-pagination.
这不同于 AAD Graph API(它不是 OData v4),它没有 return 完全合格的下一个 link,这意味着您需要进行一些更复杂的操作才能获得下一页结果。
因此 Microsoft Graph 应该会为您简化此操作。
希望对您有所帮助,
如果您希望所有用户都在一个列表中,您可以使用以下代码实现:
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
如果没有在最后一行添加对 '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);
}
我按照 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;
}