请求协助编写带分页功能的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
相关产品推荐
相关产品推荐

