如何获取Graph Connector的ExternalItems列表并批量删除?
解决Graph Connector中获取并批量删除ExternalItems的问题
问题原因分析
你遇到的几个方法失败的原因如下:
getGraphClient().external().connections().byExternalConnectionId(connectionId).get().getItems()返回null:因为externalConnection实体本身不会携带items集合数据,该属性仅用于构建API路径,不会从服务端返回。getGraphClient().external().connections().byExternalConnectionId(connectionId).items().get()抛UnknownError:Graph API没有/external/connections/{id}/items这个直接列表所有items的端点,所以SDK调用会触发无效请求错误。- 搜索API调用被禁止:搜索API的应用权限确实仅支持
site、list等指定实体类型,External Item无法通过应用权限调用搜索接口,只能使用委派权限(不适用于后台服务场景)。
可行解决方案
1. 预存ExternalItem ID(推荐)
在创建ExternalItem的过程中,将每个item的ID记录到自己的数据库或存储系统中。后续需要删除时,直接从存储中读取ID列表,逐个或批量删除。这种方式最稳定,避免依赖额外的Graph API操作。
2. 使用增量查询(Delta Query)获取所有ExternalItem
Graph API支持对ExternalItem进行增量查询,可获取连接下的全量item数据(首次调用)或后续变更数据。这是官方支持的唯一获取所有ExternalItem的方式:
// 初始化增量查询请求 DeltaCollectionPage<ExternalItem> deltaPage = getGraphClient() .external() .connections() .byExternalConnectionId(connectionId) .items() .delta() .get(); List<ExternalItem> allExternalItems = new LinkedList<>(); allExternalItems.addAll(deltaPage.getValue()); // 处理分页,获取所有数据 while (deltaPage.getNextPage() != null) { deltaPage = deltaPage.getNextPage().get(); allExternalItems.addAll(deltaPage.getValue()); } // 提取所有Item ID List<String> itemIds = allExternalItems.stream() .map(ExternalItem::getId) .collect(Collectors.toList());
注意:需要确保应用已配置ExternalItem.Read.All或ExternalItem.ReadWrite.All权限。
3. 批量删除ExternalItem
使用Graph API的批量请求功能,将多个删除操作打包为一个请求,提升效率:
BatchRequestContent batchContent = new BatchRequestContent(getGraphClient().getRequestAdapter()); for (String itemId : itemIds) { // 构建单个删除请求 RequestInformation deleteReq = getGraphClient() .external() .connections() .byExternalConnectionId(connectionId) .items() .byExternalItemId(itemId) .delete() .getRequestInformation(); // 添加到批量请求,分配唯一请求ID batchContent.addBatchRequestStep(UUID.randomUUID().toString(), deleteReq); } // 发送批量请求 BatchResponseContent batchResponse = getGraphClient().batch().post(batchContent); // 处理响应,检查删除结果 for (Map.Entry<String, BatchResponseStep> entry : batchResponse.getResponses().entrySet()) { int statusCode = entry.getValue().getStatusCode(); if (statusCode != 204) { System.err.println("Item删除失败,请求ID:" + entry.getKey() + ",状态码:" + statusCode); } }
总结
没有直接列出所有ExternalItem的API端点,推荐优先采用预存ID的方式;若无法预存,则使用增量查询获取全量数据,再通过批量请求完成删除操作,无需删除整个连接器。
内容的提问来源于stack exchange,提问作者flavio.donze
相关产品推荐
相关产品推荐

