我通过 API 使用 GraphQL 开发了 Outlook 联系人查询。 但是,在 Outlook Web 界面中,您可以看到“所有联系人”下显示的联系人比我通过 API 查询获取的联系人多得多。
graphQL 查询考虑 Default、ContactFolder、ChildFolders 和 User。尽管如此,API 查询仅返回大约 90 个联系人,而在 Outlook 中的“所有联系人”下,您可以看到大约有 1000 个可用联系人。
Outlook 帐户正在 Exchange 服务器上运行。查看联系人的详细信息时,值得注意的是,唯一的区别是标识符为 V16 的联系人不同步,而标识符为 V12 的联系人似乎总是同步的。目前还不清楚无法通过 API 查询的联系人是否实际上来自其他来源,例如来自另一台服务器。
问题:如何找出问题所在? 难道是Exchange服务器的权限问题,导致API无法查询所有联系人或目录?没有错误消息。显然,GraphQL 查询实际上只找到了大约 90 个联系人。
据我所知,Outlook 不提供 GraphQL API。如果我在这里不正确,请分享文档,我可以再看一下。
他们做提供的是他们称之为Microsoft Graph的产品,该产品基于OData构建,这是微软驱动的针对其REST风格的开源规范(请注意,GraphQL是不是REST)。
话虽如此,我们来谈谈 Microsoft Graph 和分页。使用 OData,要获取所有结果(超过一页的结果),您必须一次查询一页。
$top
这里是“我的联系人”的前 500 个结果(我认为每页最多 1000 个)的可能查询:
GET https://graph.microsoft.com/v1.0/me/contacts?$top=500
$skipToken
如果有第 2 页,第 1 页的 JSON 结果将包含一个名为
@odata.nextLink
的属性,它是一个包含相同页面大小和 $skipToken
的 URL(因此您不必进行数学计算计算出当您达到更多页数时需要多少$skip
)。
{
...
"@odata.nextLink": "https://graph.microsoft.com/v1.0/users?$top=5&$skiptoken=RFNwdAIAAQAAAD8...AAAAAAAA"
...
}
那么,对于第 2 页,只需使用他们给您的 URL:
GET https://graph.microsoft.com/v1.0/users?$top=5&$skiptoken=RFNwdAIAAQAAAD8...AAAAAAAA
然后,如果有第 3 页,您将获得另一个
nextLink
。
这是“服务器驱动的分页”。
$top
和 $skip
如果您想从头开始直接跳到第 2 页——或者如果您喜欢自己计算——您可以使用“客户端驱动的分页”来实现,它同时使用
$top
和 $skip
。这也会给你第 2 页:
GET https://graph.microsoft.com/v1.0/me/contacts?$top=500&$skip=500