Autodesk Forge OSS如何突破单次100条限制拉取全量存储桶对象
分页机制匹配说明
你判断的方向是对的,超过100条的对象拉取、指定bucketKey下的全量列表查询,完全依赖startAt游标分页实现,不存在可以一次性拉取全量数据的参数开关。
- 接口单次返回的最大记录数就是100,哪怕把
limit参数设得更高,接口也会自动截断到100,没法突破这个单次返回上限 - 分页游标就是
startAt参数:每一次请求返回的结果中,会携带当前批次的分页信息,明确给出下一批次请求需要传的startAt值 - 只要持续把上一次返回的
nextStartAt值作为下一次请求的startAt参数循环拉取,直到接口返回没有后续分页标识,就能拿到指定bucketKey下的全部对象
现有代码的调整方向
你当前的实现只做了单次固定参数的请求,缺少分页循环和游标解析逻辑,所以只能拿到固定100条数据,需要补充两个核心逻辑:
- 解析每一次接口响应里的分页字段,提取下一次请求需要的游标值
- 增加循环逻辑,直到接口返回无后续分页内容时终止
另外代码里的无效配置可以顺手修正: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
相关产品推荐
相关产品推荐

