PowerQuery/Power BI中API请求如何实现翻页迭代获取全量数据
错误原因
- Text.Combine用法错误+拼接逻辑错误:Text.Combine的第一个参数要求是文本列表,你传入单个字符串
SurveyUrl语法逻辑都错。而且拼接下一页地址时不应该用第一页的完整地址SurveyUrl拼接,应该用根域名BaseUrl和接口返回的next相对路径拼接,否则会生成非法URL,导致下一页请求失败。 - 参数传递逻辑错误:你最外层定义的
url变量是Web.Contents请求第一页返回的二进制结果,不是URL字符串,传入FnGetOnePage后Json.Document虽然能解析第一页内容,但后续调用FnGetOnePage时传入的是拼接后的URL字符串,函数逻辑不一致,且第一次请求的逻辑放到函数外导致逻辑混乱。
修复后的完整代码
let BaseUrl = "https://api.aaaaaa.com", FirstPageUrl = Text.Combine({BaseUrl, "/api/v1/survey?step=1&limit=1000"}), RequestHeaders = [Headers=[TOKEN="zzzzzzzzzzzzzzz"]], FnGetOnePage = (pageUrl as text) as record => let Response = Web.Contents(pageUrl, RequestHeaders), Source = Json.Document(Response), data = try Source[results] otherwise null, nextRelativePath = try Source[_links][next] otherwise null, nextFullUrl = if nextRelativePath <> null then Text.Combine({BaseUrl, nextRelativePath}) else null, res = [Data=data, Next=nextFullUrl] in res, GeneratedList = List.Generate( () => [currentRes = FnGetOnePage(FirstPageUrl)], each [currentRes][Data] <> null, each [currentRes = if [currentRes][Next] <> null then FnGetOnePage([currentRes][Next]) else [Data=null]], each [currentRes][Data] ) in GeneratedList
关于step遍历方案的建议
- 这个方案实现更简单,出错概率更低,适合你的接口场景:
- 先请求第一页数据,拿到
total总条数和limit单页条数,计算总页数 =Number.RoundUp(total / limit) - 生成1到总页数的整数列表,遍历每个step值拼接请求URL,批量拉取所有页数据
- 先请求第一页数据,拿到
- 优点:逻辑直观不需要解析分页链接,调试成本低
- 注意点:如果后续接口分页规则调整(比如把step参数改名、limit规则变化),需要同步修改代码,适配性比解析next链接的方案稍差。
内容的提问来源于stack exchange,提问作者ManiK
相关产品推荐
相关产品推荐

