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

为何@microsoft.graph.downloadUrl在HTTP调用中为空但Graph SDK可用?

问题:直接调用Microsoft Graph API无法获取SharePoint列表项目的@microsoft.graph.downloadUrl

直接调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:16:11