Power Query自定义连接器获取API响应体分页链接报错排查
问题描述
本问题是此前发布的《API分页字段存于JSON响应体而非响应头时,如何在Power Query自定义连接器中读取?》的后续跟进。
开发某API的自定义连接器时,该API的分页标识存放在响应体而非响应头中。官方提供的自定义连接器示例仅给出了从响应头读取分页信息的GetNextLink实现,参考代码如下:
GetNextLink = (response, optional request) => let // 提取存在的"Link"响应头 link = Value.Metadata(response)[Headers][#"Link"]?, links = Text.Split(link, ","), splitLinks = List.Transform(links, each Text.Split(Text.Trim(_), ";")), next = List.Select(splitLinks, each Text.Trim(_{1}) = "rel=""next"""), first = List.First(next), removedBrackets = Text.Range(first{0}, 1, Text.Length(first{0}) - 2) in try removedBrackets otherwise null;
从响应体取分页数据理论上比从响应头读取更简单,但实际开发出现问题:Web.Contents()返回结果中确实存在需要的next分页记录,返回结果截图如下:
编写的GetNextLink测试代码如下,尝试提取next分页链接:
GetNextLink = (response) => // response为Web.Contents()返回的原始结果 let Source = Lines.FromBinary(response), nextPage = Record.Field(Source[paging], "next") in try nextPage otherwise null;
代码运行时报错:We cannot convert a value of type Record to type Text,判断是Source步骤的取值逻辑存在问题,需要技术指导。
解决方法
报错核心原因是对Web.Contents()返回值的处理逻辑错误:
Lines.FromBinary()的作用是将二进制内容按行拆分为文本列表,返回值是list类型,不是record,直接用Source[paging]取列表字段不符合Power Query的类型规则。- 接口返回JSON格式响应时,需要先用
Json.Document()将二进制响应内容解析为Power Query可识别的Record/List结构,再直接读取对应分页字段即可。
修正后的GetNextLink实现代码:
GetNextLink = (response) => let // 将二进制响应解析为JSON结构化对象 parsedResponse = Json.Document(response), // 读取paging对象下的next字段,可根据接口实际返回结构调整字段路径 nextPage = parsedResponse[paging]?[next]? in try nextPage otherwise null;
注意事项
- 如果接口返回的next字段是相对路径,需要在该函数内拼接为完整绝对URL,否则后续分页请求会调用失败。
- 字段取值时建议添加
?容错符,避免最后一页不存在paging或next字段时直接抛出运行错误。 - 如果调用
Web.Contents()时已经提前用Json.Document()做了解析,那传入的response参数本身就是结构化的Record对象,不需要重复调用Json.Document(),直接读取对应字段即可。
内容的提问来源于stack exchange,提问作者Overfloweth
相关产品推荐
相关产品推荐

