Power BI调用Totvs API(带Basic认证与请求体)出现500错误
Power BI通过Basic认证调用Totvs API连接失败解决方案
问题背景
在Power BI中使用M语言通过账号密码的Basic认证调用Totvs API时,无法建立连接,但相同请求在Postman中可正常运行。用户曾尝试修改请求头为Accept-Charset或Accept,问题未解决。
原M语言代码
= let apiUrl = "(censored)", body = Text.ToBinary(" { ""codEmitenteIni"": 000000, ""codEmitenteFin"": 999999, ""tipoRelatorio"": ""detalhado"" } "), result = Json.Document(Web.Contents(apiUrl,[Headers=[#"Authorization"="Basic login:password"], Content=body])) in result
错误信息
DataSource.Error: '[...]' (500) or return a HTML login page
核心问题与修正方案
1. Basic认证格式错误
Basic认证要求将login:password进行Base64编码后,再拼接Basic 前缀,原代码直接使用明文是错误的。
2. 请求体与请求头优化
直接用Text.ToBinary构造JSON可能存在格式问题,改用Json.FromValue能确保JSON结构合规;同时需添加Content-Type: application/json头,明确请求体类型。
修正后的代码
let apiUrl = "(censored)", // 对账号密码做Base64编码 authStr = "login:password", encodedAuth = "Basic " & Binary.ToText(Text.ToBinary(authStr), BinaryEncoding.Base64), // 用Json.FromValue构造标准JSON请求体 body = Json.FromValue([ codEmitenteIni = 000000, codEmitenteFin = 999999, tipoRelatorio = "detalhado" ]), // 发起请求,补充必要请求头 result = Json.Document(Web.Contents(apiUrl, [ Headers = [ #"Authorization" = encodedAuth, #"Content-Type" = "application/json" ], Content = body ])) in result
额外排查建议
- 对齐Postman请求头:打开Postman的请求详情,复制所有请求头(如
User-Agent、Accept等)到Power BI的Headers参数中,确保请求环境完全一致。 - 调整Power BI隐私设置:若API是内部资源,在Power BI的「数据源设置」-「隐私」中,将该数据源设置为「组织」级别,避免跨源权限拦截。
- 检查API端点权限:确认Power BI使用的账号拥有该Totvs API的访问权限,避免因权限不足返回500错误。
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

