使用Microsoft Graph API SDK查询SharePoint文件合并请求报错如何解决
问题原因
- 合并后的链式写法不符合Microsoft Graph API的路由规则:当导航路径经过
Lists["xxx"].Drive段后,服务端不支持直接在该段后拼接Root+文件路径的深层导航,Graph SDK生成的最终请求URL会被服务端识别为非法格式,因此返回400 Bad Request。 - 分三步请求可以成功的原因是每一步都获取到了对应实体(站点、驱动器)的唯一ID,后续用ID作为路由参数的请求格式是Graph API原生支持的规范格式,不会出现路由解析错误。
最佳实现方式
你完全可以实现单次请求获取目标文件,只需调整路由写法,绕开Lists->Drive的导航段即可,推荐写法如下:
var file = await graphClient.Sites["myDomain:/relativePath:"] // 用冒号语法直接定位站点 .Drives["mylib"] // 直接通过文档库名称获取对应的驱动器 .Root.ItemWithPath("folder1/myfile.txt") // 拼接文件相对库根的路径 .Request().GetAsync().ConfigureAwait(false);
说明:
Sites["myDomain:/relativePath:"]是Graph API支持的站点简写格式,格式为{站点域名}:/{站点相对路径}:,可以一步定位到目标站点,无需单独调用SiteWithPath方法。
SharePoint文档库的名称与对应Drive的名称属性一致,因此可以直接在Drives索引器中传入文档库名称获取对应驱动器。
如果你的场景必须通过Lists导航获取驱动器,也可以使用$expand参数一次请求拿到所需数据,无需多次接口往返:
var list = await graphClient.Sites["myDomain"] .SiteWithPath("relativePath") .Lists["mylib"] .Request() .Expand(l => l.Drive.Root.ItemWithPath("folder1/myfile.txt")) .GetAsync().ConfigureAwait(false); var file = list.Drive.Root.Children[0];
内容的提问来源于stack exchange,提问作者user3616544
相关产品推荐
相关产品推荐

