如何通过Azure DevOps Feed REST API获取超1000个包及版本?
Azure DevOps NuGet包全量获取与下载方案
一、突破1000条返回限制的分页策略
虽然API 7.1版本未返回续传令牌,但可通过$skip参数实现分页查询,逐步拉取所有包数据:
- 初始请求设置
$skip=0,每次最多返回1000条结果 - 每次请求成功后,将
$skip值累加当前返回的包数量,发起下一次请求 - 当返回的
value数组为空时,停止循环
Python分页查询示例
import requests ADO_ORG = "你的组织名" ADO_FEED = "你的Feed名" PAT = "你的个人访问令牌(需有Packaging Read权限)" API_VERSION = "7.1-preview.1" headers = { "Authorization": f"Basic {PAT}" } all_packages = [] skip = 0 while True: url = f"https://feeds.dev.azure.com/{ADO_ORG}/_apis/packaging/Feeds/{ADO_FEED}/packages?$skip={skip}&api-version={API_VERSION}" response = requests.get(url, headers=headers) response.raise_for_status() data = response.json() current_pkgs = data.get("value", []) if not current_pkgs: break all_packages.extend(current_pkgs) skip += len(current_pkgs) print(f"已获取{len(all_packages)}个包") print(f"全量包获取完成,共{len(all_packages)}个")
二、批量下载NuGet包
从获取的包详情中提取每个版本的downloadUrl,携带认证头直接发起下载请求:
- 遍历每个包的
versions数组,取出对应版本的下载链接 - 按「包名+版本号」命名保存文件,避免重名
- 下载时使用流式请求,避免大文件占用过多内存
Python批量下载示例
import os save_dir = "nuget_packages" os.makedirs(save_dir, exist_ok=True) for pkg in all_packages: pkg_name = pkg["name"] for version in pkg["versions"]: version_num = version["version"] download_url = version["downloadUrl"] save_path = os.path.join(save_dir, f"{pkg_name}.{version_num}.nupkg") if os.path.exists(save_path): print(f"已存在,跳过:{save_path}") continue with requests.get(download_url, headers=headers, stream=True) as r: r.raise_for_status() with open(save_path, "wb") as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) print(f"下载完成:{save_path}")
三、关键注意事项
- PAT权限:确保个人访问令牌拥有
Packaging (Read)权限,否则会返回403权限错误 - 限流处理:短时间内大量请求可能触发限流,可添加
time.sleep(0.5)之类的延迟 - 异常重试:建议为请求添加重试逻辑,处理网络波动或API临时不可用的情况
内容的提问来源于stack exchange,提问作者B J
相关产品推荐
相关产品推荐

