为何@microsoft.graph.downloadUrl在HTTP调用中为空但Graph SDK可用?
直接调用Graph API的HTTP请求时,返回的@microsoft.graph.downloadUrl字段始终为空,但使用Microsoft Graph SDK执行等价逻辑时却能正确获取到该值。
直接HTTP请求示例(返回空的downloadUrl)
GET https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items?expand=driveItem(select=id,contentType,@microsoft.graph.downloadUrl)&$top=900
Microsoft Graph SDK示例(能正确获取downloadUrl)
var listItemsResponse = await graphServiceClient.Sites[site.Id].Lists[documentList.Id].Items.GetAsync((requestConfiguration) => { requestConfiguration.QueryParameters.Expand = new string[] { "driveItem" }; requestConfiguration.QueryParameters.Select = new string[] { "id", "contentType" }; requestConfiguration.QueryParameters.Top = 900; }); bool hasDownloadUrl = driveItem.AdditionalData.TryGetValue("@microsoft.graph.downloadUrl", out object? downloadUrl);
原因及解决办法
问题出在直接HTTP请求的expand参数语法上:@microsoft.graph.downloadUrl是动态派生属性,不属于driveItem的固有属性,无法通过select参数指定获取。当你在driveItem(select=...)中明确指定字段时,Graph API只会返回你列出的固有属性,不会自动包含派生的downloadUrl。
而SDK的请求中仅指定了expand=driveItem,没有限制driveItem的返回字段,因此Graph API会自动返回包括@microsoft.graph.downloadUrl在内的完整driveItem数据(只要权限足够)。
修正后的直接HTTP请求
去掉expand中对driveItem的select限制,或者确保派生属性能被返回:
GET https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items?$expand=driveItem&$select=id,contentType&$top=900
如果需要仅获取driveItem的部分固有属性同时保留downloadUrl,可以使用$select=*来包含所有固有属性,派生属性会自动附加:
GET https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items?$expand=driveItem($select=id,contentType,*)&$top=900
另外需要确保请求使用的令牌拥有Files.Read或更高权限的范围,否则即使请求语法正确,@microsoft.graph.downloadUrl也不会返回。
内容的提问来源于stack exchange,提问作者Mannan Bahelim
相关产品推荐
相关产品推荐

