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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:19:54