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

请求协助编写带分页功能的REST API M查询(Power Query)

Power Query M语言实现REST API分页获取全量数据

核心实现思路

通过List.Generate生成所有分页请求参数,循环调用API获取每一页数据,直到返回的记录数小于指定的take值,最后合并所有页面的结果。

完整代码

// 基础配置参数
    baseUrl = "my base url",
    endpoint = "/sites",
    take = 1000, // 按API要求设置每页条数,原代码设为10000,若API限制take=1000则修改此处
    
    // 封装单页API请求逻辑
    getPage = (skip as number) =>
        let
            requestUrl = baseUrl & endpoint & "?take=" & Text.From(take) & "&skip=" & Text.From(skip),
            response = Web.Contents(requestUrl),
            json = Json.Document(response),
            sitesList = json[Sites],
            // 将列表转为表格并展开记录列
            table = Table.FromList(sitesList, Splitter.SplitByNothing(), null, Record.FieldNames),
            expandedTable = Table.ExpandRecordColumn(table, "Column1", Record.FieldNames(table{0}[Column1]))
        in
            expandedTable,
    
    // 生成所有分页数据
    allPages = List.Generate(
        () => [skip = 0, pageData = getPage(0)], // 初始值:从skip=0开始请求第一页
        each Table.RowCount([pageData]) = take, // 终止条件:当前页行数小于take时停止循环
        each [skip = [skip] + take, pageData = getPage([skip] + take)], // 迭代:计算下一个skip值并请求
        each [pageData] // 提取每页的表格数据
    ),
    
    // 合并所有分页表格
    combinedTable = Table.Combine(allPages & {getPage(List.Last(allPages)[skip] + take)}) // 补充最后一页数据
in
    combinedTable

关键部分解释

  • getPage函数:把单页请求的逻辑封装成函数,传入skip参数即可获取对应页的结构化表格,避免重复代码。
  • List.Generate循环:
    • 初始状态:从skip=0开始请求第一页数据。
    • 终止判断:当当前页返回的行数等于take时继续循环,小于take则停止(说明是最后一页)。
    • 迭代逻辑:每次将skip增加take,请求下一页数据。
  • Table.Combine:把所有分页的表格合并成一个完整的数据集,最后手动补充最后一页(因为循环会在最后一页前停止)。

可选优化(用总行数控制分页)

如果API返回的PagerInfo包含总行数,也可以直接用总行数计算总页数,替代“判断当前页行数”的逻辑,示例:

baseUrl = "my base url",
    endpoint = "/sites",
    take = 1000,

    getPage = (skip as number) =>
        let
            requestUrl = baseUrl & endpoint & "?take=" & Text.From(take) & "&skip=" & Text.From(skip),
            response = Web.Contents(requestUrl),
            json = Json.Document(response),
            sitesList = json[Sites],
            table = Table.FromList(sitesList, Splitter.SplitByNothing(), null, Record.FieldNames),
            expandedTable = Table.ExpandRecordColumn(table, "Column1", Record.FieldNames(table{0}[Column1]))
        in
            expandedTable,
    
    // 获取总行数
    firstResponse = Web.Contents(baseUrl & endpoint & "?take=1&skip=0"),
    firstJson = Json.Document(firstResponse),
    totalRows = firstJson[PagerInfo][TotalRows],
    
    // 生成所有skip值并请求
    allSkips = List.Generate(()=>0, each _ < totalRows, each _ + take),
    allPages = List.Transform(allSkips, getPage),
    combinedTable = Table.Combine(allPages)
in
    combinedTable

内容的提问来源于stack exchange,提问作者br.nz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:47:31