为啥 Power Query 调用 Azure API 管理后端 URL?
Posted
技术标签:
【中文标题】为啥 Power Query 调用 Azure API 管理后端 URL?【英文标题】:Why does Power Query call Azure API Management backend URL?为什么 Power Query 调用 Azure API 管理后端 URL? 【发布时间】:2020-12-10 18:01:54 【问题描述】:我有一个托管在 Azure API 管理 (APIM) 实例后面的 OData 端点的 Azure 应用服务。为了防止直接调用应用服务,它受到只有 APIM 拥有的证书的保护。
当我通过 Chrome 或 Postman 调用 APIM URL 时,它的行为符合预期。只有一个请求,没有重定向或有趣的业务,它返回 OData 根。 Here is a Fiddler log of a request to the APIM using Postman
但是,当使用 OData.Feed() 在 Power Query 中使用与 OData 源相同的 URL 时,它会返回一个 301 转发到后端 URL,这显然会失败,因为该 URL 受证书保护。 Here is a Fiddler log of a request to the APIM using Power Query in Excel
我已将订阅密钥配置为在标头中传递,但我也尝试将其作为查询参数,但它在 Power Query 中都不起作用。我也尝试过直接使用 OData 实体端点(以避免 $metadata 调用),但没有成功。
Power Query 使用的用户代理是 Microsoft.Data.Mashup,但我没有找到任何关于它与 APIM 兼容性的文档,但这应该没关系,对吧?
【问题讨论】:
【参考方案1】:在研究了两天之后,我以典型的方式在 *** 上发布后立即找到了答案。如果有人有同样的问题,我会留下这个问题。
问题在于 Power Query 连接器自动跟随 @odata.context 链接获取元数据,以及 @odata.nextLink 链接进行分页。这些链接仍然将应用服务站点作为主机,而不是 APIM 主机。
因此,快速编辑 APIM 中的出站规则能够解决问题
<outbound>
<base />
<set-variable name="backendBaseUrl" value="@(context.Request.OriginalUrl.Scheme + "://" + context.Request.OriginalUrl.Host.ToString() + context.Api.Path)" />
<find-and-replace from="@("http://" + context.Request.Url.Host.ToString())" to="@((string)context.Variables["backendBaseUrl"])" />
<find-and-replace from="@("https://" + context.Request.Url.Host.ToString())" to="@((string)context.Variables["backendBaseUrl"])" />
</outbound>
这里我必须规则来替换 http 和 https URL,以防某些配置发生变化。
【讨论】:
以上是关于为啥 Power Query 调用 Azure API 管理后端 URL?的主要内容,如果未能解决你的问题,请参考以下文章
为啥power query合并查询中的右反查询出来的结果为空
为啥我的excel的Power Query没有按行分隔分选项
在 Power Query 中调用 Power BI API