如何通过Graph API获取SharePoint Webhook的resourceData ID?
问题背景
我正在使用MS Graph API开发SharePoint Online驱动器的Webhook通知功能,当前订阅配置如下:
POST https://graph.microsoft.com/v1.0/subscriptions
请求体:
{ "changeType": "updated", "notificationUrl": "https://a123bluhbluh.ngrok-free.app/api/WebHook", "resource": "/drive/root", "expirationDateTime": "2024-07-01T00:00:00Z", "clientState": "c9a46c1f-9d7d-4e2b-80d3-4b18a0d0d4ae" }
添加/删除文件时能收到通知,但resourceData字段仅返回@odata.type,其余ID等字段为空:
{"value":[ {"subscriptionId":"XXX", "clientState":"c9a46c1f-9d7d-4e2b-80d3-4b18a0d0d4ae", "tenantId":"XXX", "resource":"drives/root", "resourceData":{ "@odata.type":"#Microsoft.Graph.DriveItem", "Id" : null, "ODataEtag" : null, "ODataId" : null }, "changeType":"updated", "subscriptionExpirationDateTime":"2024-07-01T00:00:00Z" } ] }
尝试添加"includeResourceData": true参数时订阅失败,该参数对SharePoint资源无效,需要获取DriveItem ID实现后续功能。
原因分析
SharePoint Online的驱动器Webhook订阅不支持includeResourceData参数,这是Graph API的资源限制:该参数仅适用于Outlook、Teams等部分资源,SharePoint的Webhook通知仅会告知资源发生变更,不会返回完整的资源详情。
解决方案
通过DriveItem Delta查询获取具体变更的DriveItem信息,步骤如下:
1. 初始化Delta查询,获取初始Delta链接
首次调用Delta API获取驱动器根目录的变更记录,同时保存响应中的@odata.deltaLink(后续增量查询使用):
GET https://graph.microsoft.com/v1.0/drive/root/delta
响应示例(关键部分):
{ "@odata.deltaLink": "https://graph.microsoft.com/v1.0/drive/root/delta?$deltatoken=abc123...", "value": [ { "id": "01XYZ...", "name": "example.docx", "file": {}, "@odata.type": "#microsoft.graph.driveItem" } ] }
2. 收到Webhook通知后,调用Delta链接获取增量变更
每次收到Webhook通知时,使用保存的@odata.deltaLink发起请求,即可获取本次变更的具体DriveItem列表(包含ID、变更类型等信息):
GET https://graph.microsoft.com/v1.0/drive/root/delta?$deltatoken=abc123...
响应中会返回所有新增、删除或更新的DriveItem,从中提取所需的ID即可。
3. 优化订阅配置(可选)
将changeType调整为"created,deleted,updated",更精准匹配文件操作类型:
{ "changeType": "created,deleted,updated", "notificationUrl": "https://a123bluhbluh.ngrok-free.app/api/WebHook", "resource": "/drive/root", "expirationDateTime": "2024-07-01T00:00:00Z", "clientState": "c9a46c1f-9d7d-4e2b-80d3-4b18a0d0d4ae" }
4. 权限要求
确保应用已获得以下权限之一(需授予管理员同意):
Files.ReadWrite.All(应用权限)Sites.ReadWrite.All(应用权限)
内容的提问来源于stack exchange,提问作者John Park
相关产品推荐
相关产品推荐

