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

如何使用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)条资产数据"

关键细节说明

  1. do-while循环的优势:先执行一次请求再判断条件,避免第一页就没有数据时出现不必要的逻辑判断。
  2. 错误处理:通过try-catch捕获网络异常、权限问题等,保证脚本的健壮性。如果API有限流机制,还可以在catch里添加重试逻辑。
  3. 终止条件判断:因为最后一页的数据条数大概率小于100,所以当返回的数据数量不等于$maxPerPage时,就可以停止循环了。

优化建议

  • 添加请求延迟:如果API有请求频率限制,在循环末尾加上Start-Sleep -Seconds 1,避免触发限流策略。
  • 分批处理大数量数据:如果资产总数非常大,不要一次性把所有数据存入数组,可以考虑每获取几页就写入文件,减少内存占用。
  • 检查响应头:部分API会在响应头中返回总页数或总记录数,你可以通过$response = Invoke-RestMethod -PassThru ...获取响应对象,查看$response.Headers是否有相关字段,如果有的话可以更精准地控制循环次数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:32:05