使用Microsoft Graph API获取SharePoint网站文档库的问题咨询
嗨,我来帮你解决这个关于Microsoft Graph API和SharePoint文档库的问题~
你提到用代码获取SharePoint Site实体时,返回的对象里drive/drives和lists字段都是None,但在网站仪表盘里明明能正常操作文档库(截图显示了Site实体的基础属性,以及网站仪表盘里的文档库界面)。针对你的两个问题,我来逐一解答:
问题1:为什么仪表盘里能看到的文档库,在API返回的Site对象里找不到?它们是关联的吗?
这是因为Microsoft Graph API默认只会返回资源的基础属性,不会自动加载关联的导航属性(比如drives、lists这类和Site绑定的关联资源)。你看到的None不是说文档库不存在,而是API没有主动返回这部分数据——毕竟如果默认加载所有关联资源,会导致响应数据过大,影响接口性能。
其实你在仪表盘里操作的文档库,就是和这个Site直接关联的Drive(文档库本质上就是一种特殊的Drive/List),两者是完全绑定的,只是API默认没把这部分数据返回给你而已。
问题2:已知site_id的情况下,怎么通过代码管理对应的Drive实体?
有两种实用的方式,我结合你的代码示例给你修改说明:
方式1:获取Site时同时展开drives属性
你可以在调用get()方法时,配置请求参数,用$expand指定要加载drives导航属性,这样返回的Site对象里就会包含对应的文档库Drive了。
修改你的测试代码部分:
async def test_api(): sp_dao = SharePointDAO() site_id = ... # 你的site id # 配置请求参数,指定要展开drives属性 request_config = RequestConfiguration( query_parameters={ "expand": "drives" } ) site = await sp_dao.client.sites.by_site_id(site_id).get(request_configuration=request_config) logger.info(site.drives) # 现在就能看到文档库对应的Drive列表了
方式2:直接通过Site ID获取关联的Drives
如果你不需要Site的其他基础属性,也可以直接调用sites/{site_id}/drives接口,直接获取该Site下的所有Drive(也就是所有文档库):
async def test_api(): sp_dao = SharePointDAO() site_id = ... # 你的site id drives = await sp_dao.client.sites.by_site_id(site_id).drives.get() logger.info(drives) # 返回该网站下的所有文档库Drive
如果要定位到特定的文档库(比如默认的“文档”库),可以在获取后筛选,或者直接通过名称/id访问:
# 获取网站的默认文档库(通常名称为"Documents") async def get_default_document_library(site_id): client = GraphClientSingleton.get_client() drives = await client.sites.by_site_id(site_id).drives.get() for drive in drives.value: if drive.name == "Documents": return drive return None
拿到Drive对象后,你就可以进行文件上传、下载、创建文件夹等各种文档库管理操作啦。
备注:内容来源于stack exchange,提问作者Luca

