如何使用Invoke-RestMethod批量获取API的所有分页数据?
获取Samanage API多页数据的最佳实践
我经常处理分页API的数据抓取需求,针对你遇到的Samanage API每页仅返回100条数据的问题,最可靠的方案就是循环遍历每一页,直到没有更多数据返回为止。下面是具体的实现思路和代码:
核心思路
Samanage API默认每页返回100条,且没有直接返回总页数的响应头,所以我们可以通过以下逻辑循环获取:
- 从第1页开始请求
- 每次请求后将数据合并到总集合
- 页码自增,直到返回的数据为空,或者数据数量小于100(说明是最后一页)
完整代码示例
# 初始化存储所有资产的数组和页码变量 $allAssets = @() $currentPage = 1 $maxPerPage = 100 # Samanage API默认每页100条 $baseUrl = "https://api.samanage.com/hardwares.json" do { # 拼接当前页的请求地址 $requestUrl = "$baseUrl`?page=$currentPage" try { # 请求当前页数据 $pageData = Invoke-RestMethod -Uri $requestUrl -Credential $mycreds ` -Headers @{"Accept"="application/vnd.samanage.v1.1+xml"} ` -ContentType "application/json" -Method GET # 如果当前页有数据,添加到总数组 if ($pageData) { $allAssets += $pageData Write-Host "已获取第$currentPage页,累计$($allAssets.Count)条记录" } # 页码加1,准备请求下一页 $currentPage++ } catch { # 捕获请求异常,避免脚本直接崩溃 Write-Error "请求第$currentPage页时失败:$($_.Exception.Message)" break # 可根据需求调整为重试逻辑,比如最多重试3次 } # 循环终止条件:当前页有数据,且数据条数等于每页最大值(说明还有下一页) } while ($pageData -and $pageData.Count -eq $maxPerPage) Write-Host "所有数据获取完成,共$($allAssets.Count)条资产数据"
关键细节说明
do-while循环的优势:先执行一次请求再判断条件,避免第一页就没有数据时出现不必要的逻辑判断。- 错误处理:通过
try-catch捕获网络异常、权限问题等,保证脚本的健壮性。如果API有限流机制,还可以在catch里添加重试逻辑。 - 终止条件判断:因为最后一页的数据条数大概率小于100,所以当返回的数据数量不等于
$maxPerPage时,就可以停止循环了。
优化建议
- 添加请求延迟:如果API有请求频率限制,在循环末尾加上
Start-Sleep -Seconds 1,避免触发限流策略。 - 分批处理大数量数据:如果资产总数非常大,不要一次性把所有数据存入数组,可以考虑每获取几页就写入文件,减少内存占用。
- 检查响应头:部分API会在响应头中返回总页数或总记录数,你可以通过
$response = Invoke-RestMethod -PassThru ...获取响应对象,查看$response.Headers是否有相关字段,如果有的话可以更精准地控制循环次数。
内容的提问来源于stack exchange,提问作者curtcab
相关产品推荐
相关产品推荐

