You need to enable JavaScript to run this app. Autodesk Forge OSS如何突破单次100条限制拉取全量存储桶对象
优惠活动
大模型
产品
解决方案
定价
更多

Autodesk Forge OSS如何突破单次100条限制拉取全量存储桶对象

分页机制匹配说明

你判断的方向是对的,超过100条的对象拉取、指定bucketKey下的全量列表查询,完全依赖startAt游标分页实现,不存在可以一次性拉取全量数据的参数开关。

  • 接口单次返回的最大记录数就是100,哪怕把limit参数设得更高,接口也会自动截断到100,没法突破这个单次返回上限
  • 分页游标就是startAt参数:每一次请求返回的结果中,会携带当前批次的分页信息,明确给出下一批次请求需要传的startAt值
  • 只要持续把上一次返回的nextStartAt值作为下一次请求的startAt参数循环拉取,直到接口返回没有后续分页标识,就能拿到指定bucketKey下的全部对象
现有代码的调整方向

你当前的实现只做了单次固定参数的请求,缺少分页循环和游标解析逻辑,所以只能拿到固定100条数据,需要补充两个核心逻辑:

  1. 解析每一次接口响应里的分页字段,提取下一次请求需要的游标值
  2. 增加循环逻辑,直到接口返回无后续分页内容时终止
    另外代码里的无效配置可以顺手修正:GET请求不需要设置ContentType,原代码里的appication/json拼写错误也可以一并删掉,不影响请求本身。
全量查询的参考实现

循环拉取的核心逻辑如下(和你原有代码的HttpWebRequest实现风格保持一致):

// 初始化全量结果列表、初始游标、基础参数
List<BucketObjectInfo> fullObjectList = new List<BucketObjectInfo>();
string? currentCursor = null;
string targetBucketKey = "mybucketkey"; // 替换为实际的目标bucketKey
string validAccessToken = "my token"; // 替换为实际的有效访问令牌

do
{
    // 拼接带分页参数的请求地址
    string requestUrl = $"https://developer.api.autodesk.com/oss/v2/buckets/{targetBucketKey}/objects?limit=100";
    if (!string.IsNullOrEmpty(currentCursor))
    {
        // 游标是字符串类型的对象key,必须做URL转义避免特殊字符导致请求失败
        requestUrl += $"&startAt={Uri.EscapeDataString(currentCursor)}";
    }

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
    request.Method = "Get";
    request.KeepAlive = true;
    request.Headers.Add("Authorization", $"Bearer {validAccessToken}");

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            string responseContent = sr.ReadToEnd();
            // 解析当前批次的返回结果
            var batchResult = JsonConvert.DeserializeObject<ForgeObjectListResponse>(responseContent);
            // 将当前批次的对象追加到全量列表
            fullObjectList.AddRange(batchResult.Items);
            // 提取下一批次的游标值
            currentCursor = batchResult.Pagination?.NextStartAt;
            // 当返回的最后一个评估对象和下一页游标一致时,说明已经拉取到最后一页,清空游标终止循环
            if (batchResult.Pagination?.LastEvaluatedKey == currentCursor)
            {
                currentCursor = null;
            }
        }
    }
} while (!string.IsNullOrEmpty(currentCursor));

// 配套的JSON解析模型,匹配接口返回结构
public class ForgeObjectListResponse
{
    public List<BucketObjectInfo> Items { get; set; }
    public PaginationDetail Pagination { get; set; }
}
public class PaginationDetail
{
    public string NextStartAt { get; set; }
    public string LastEvaluatedKey { get; set; }
}
public class BucketObjectInfo
{
    public string ObjectKey { get; set; }
    public long Size { get; set; }
    public string ObjectId { get; set; }
    public string Location { get; set; }
}
实现避坑提示
  • startAt是基于对象key字典序的游标,不是数字类型的页码,不要自行计算页码累加值传给参数,必须严格使用上一次响应返回的nextStartAt值
  • 带特殊字符(比如空格、斜杠、中文)的对象key作为游标传参时,一定要做URL编码,否则会出现400参数错误
  • 全量拉取过程中如果遇到临时网络波动、接口限流,需要增加指数退避重试逻辑,避免因为单次请求失败中断全量拉取流程

内容的提问来源于stack exchange,提问作者hamdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 19:24:03