PHP SDK调用Microsoft Graph仅返回200条结果,如何获取全部条目?
问题解答:Microsoft Graph 获取DriveItem结果仅返回200条的处理方案
问题描述
调用以下代码获取根目录下的DriveItem时,仅返回200条结果,但实际根目录存在300+个目录:
$driveItems = $response->getResponseAsObject(\Microsoft\Graph\Model\DriveItem::class);
查询到相关setPageSize()的用法示例:
$docGrabber = $graph->createCollectionRequest("GET", "/me/drive/root/children") ->setReturnType(Model\DriveItem::class) ->setPageSize(2);
同时了解到:
部分针对Microsoft Graph的查询会返回多页数据,原因可能是服务器端分页或使用了$top查询
后续补充的参考信息:
注意:如果集合超出默认页面大小(200条),响应中会返回@odata.nextLink属性,表明还有更多可用项目,并提供下一页项目的请求URL。
$top 设置结果的页面大小。
需要解决的问题:
- $top查询应在哪里设置?
- $top会对总记录数产生怎样的影响?
- 获取超过200条结果的最佳方式是什么?
解答
1. $top的设置位置
在Microsoft Graph PHP SDK中,有两种规范的设置方式:
- 直接拼接请求参数:在请求URL后追加查询参数,示例:
$docGrabber = $graph->createCollectionRequest("GET", "/me/drive/root/children?$top=300") ->setReturnType(Model\DriveItem::class); - 使用SDK的
addQueryOptions()方法:更贴合SDK设计的用法,示例:use Microsoft\Graph\Core\GraphConstants; $docGrabber = $graph->createCollectionRequest("GET", "/me/drive/root/children") ->setReturnType(Model\DriveItem::class) ->addQueryOption(GraphConstants::QUERY_TOP, 300);
2. $top对总记录数的影响
$top仅用于限制单次请求返回的最大结果数量,不会改变实际存在的总记录数:
- 当$top值小于实际总记录数时,仅返回对应数量的结果,剩余数据需通过分页获取
- 当$top值大于实际总记录数时,会返回所有存在的结果
- 注意:大部分文件相关的Graph接口对$top有上限限制,通常最大允许设置为999,超过上限会自动按接口允许的最大值返回
3. 获取超过200条结果的最佳方式
由于Graph默认采用服务器端分页(默认页大小200),最佳方式是通过分页遍历获取全部结果,利用响应中的@odata.nextLink循环请求下一页数据,SDK提供了便捷的实现方式:
方式一:默认分页遍历
$request = $graph->createCollectionRequest("GET", "/me/drive/root/children") ->setReturnType(Model\DriveItem::class); $allDriveItems = []; do { $pageItems = $request->execute(); $allDriveItems = array_merge($allDriveItems, $pageItems); // 检查并设置下一页请求链接 } while ($request->getNextLink() && $request->setNextLink($request->getNextLink()));
方式二:结合$top调整页大小
如果需要减少请求次数,可设置较大的$top值(如999),再配合分页获取剩余数据:
use Microsoft\Graph\Core\GraphConstants; $request = $graph->createCollectionRequest("GET", "/me/drive/root/children") ->setReturnType(Model\DriveItem::class) ->addQueryOption(GraphConstants::QUERY_TOP, 999); $allDriveItems = []; do { $pageItems = $request->execute(); $allDriveItems = array_merge($allDriveItems, $pageItems); } while ($request->getNextLink() && $request->setNextLink($request->getNextLink()));
内容的提问来源于stack exchange,提问作者JI-Web
相关产品推荐
相关产品推荐

