msgraph-sdk-php v2如何在请求中传递skiptoken?
在msgraph-sdk-php v2中获取超过100条用户数据的正确分页实现
错误原因分析
你之前的两种方法都存在问题:
- 方法一错把
skiptoken放到了expand参数里,expand是用来关联查询关联资源的,和分页逻辑完全不相关 - 方法二中如果直接把完整的
nextLinkURL赋值给skiptoken参数,会导致请求参数格式错误,必须提取出URL中$skiptoken对应的具体值
正确实现方式
方式一:手动处理分页
适合需要自定义分页逻辑的场景,步骤如下:
- 发起初始请求获取第一页数据,同时拿到
nextLink - 从
nextLink中解析出$skiptoken的具体值 - 创建新的请求配置,将
skiptoken参数设置为解析出的值,发起下一页请求 - 循环直到没有
nextLink为止
// 初始请求获取第一页数据(可设置top参数指定每页数量,最大999) $initialConfig = new UsersRequestBuilderGetRequestConfiguration(); $initialConfig->queryParameters = UsersRequestBuilderGetRequestConfiguration::createQueryParameters(); $initialConfig->queryParameters->top = 999; $response = $o365->users()->get($initialConfig)->wait(); $allUsers = $response->getValue(); // 循环处理后续分页 while ($nextLink = $response->getOdataNextLink()) { // 从nextLink中解析出skiptoken值 $queryString = parse_url($nextLink, PHP_URL_QUERY); parse_str($queryString, $queryParams); $skipToken = $queryParams['$skiptoken']; // 创建下一页请求配置 $nextConfig = new UsersRequestBuilderGetRequestConfiguration(); $nextConfig->queryParameters = UsersRequestBuilderGetRequestConfiguration::createQueryParameters(); $nextConfig->queryParameters->skiptoken = $skipToken; // 请求下一页并合并数据 $response = $o365->users()->get($nextConfig)->wait(); $allUsers = array_merge($allUsers, $response->getValue()); }
方式二:使用PageIterator自动分页(推荐)
SDK内置了PageIterator工具,可以自动处理分页逻辑,无需手动解析skiptoken,代码更简洁:
use Microsoft\Graph\Core\PageIterator; // 初始请求配置 $requestConfig = new UsersRequestBuilderGetRequestConfiguration(); $requestConfig->queryParameters = UsersRequestBuilderGetRequestConfiguration::createQueryParameters(); $requestConfig->queryParameters->top = 999; // 设置每页最大数量 $response = $o365->users()->get($requestConfig)->wait(); $allUsers = []; // 初始化PageIterator $pageIterator = new PageIterator( $response, $o365->getRequestAdapter(), \Microsoft\Graph\Generated\Models\User::class ); // 遍历所有分页数据 $pageIterator->iterate(function ($user) use (&$allUsers) { $allUsers[] = $user; return true; // 返回true继续迭代,返回false可终止迭代 });
内容的提问来源于stack exchange,提问作者Destinqo
相关产品推荐
相关产品推荐

