You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

msgraph-sdk-php v2如何在请求中传递skiptoken?

在msgraph-sdk-php v2中获取超过100条用户数据的正确分页实现

错误原因分析

你之前的两种方法都存在问题:

  • 方法一错把skiptoken放到了expand参数里,expand是用来关联查询关联资源的,和分页逻辑完全不相关
  • 方法二中如果直接把完整的nextLink URL赋值给skiptoken参数,会导致请求参数格式错误,必须提取出URL中$skiptoken对应的具体值

正确实现方式

方式一:手动处理分页

适合需要自定义分页逻辑的场景,步骤如下:

  1. 发起初始请求获取第一页数据,同时拿到nextLink
  2. 从nextLink中解析出$skiptoken的具体值
  3. 创建新的请求配置,将skiptoken参数设置为解析出的值,发起下一页请求
  4. 循环直到没有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:37:11