首页 > 解决方案 > 如何计划刷新 Web.Contents 数据源?

问题描述

我正在尝试在 Power BI Web 应用 ( https://app.powerbi.com ) 中的数据集上设置“计划刷新”。

通常我应该在数据集设置中看到这些选项:

在此处输入图像描述

但是当我进入设置时,我会收到这个警告:

在此处输入图像描述

并且无法选择“网关连接”或数据源设置。

我发现了一篇有用的文章,它解释了 Web.Contents 的问题以及如何解决它:

https://blog.crossjoin.co.uk/2016/08/23/web-contents-m-functions-and-dataset-refresh-errors-in-power-bi/

我应用了这个,它仍然不起作用。

在 Power BI Desktop 中,没有列出任何数据源,因为我使用的是手工编写的查询。它的工作方式是有一个主查询(Log Scroll),它调用一个递归函数查询(RecursiveFetch)。然后,该函数调用一个 Web API,该 API 每次调用时都会发送一个新的 JSON 数据页面,以一种“滚动”的方式。

日志滚动查询如下所示:

let
    url = "http://exampleURL:1000"
    Source = RecursiveFetch(url, 5, null, null)
in
    Source

RecursiveFetch看起来像这样:

let
    RecursiveFetch= (url, scrollCount, scrollID, counter) =>

    let
        Counter = if (counter = null) then 0 else counter,
        Results = if (scrollID = null) then
            Json.Document(Web.Contents(url,
                [
                    Headers=[
                        #"Authorization"="Basic <key here>",
                        #"Content-Type"="application/json"
                    ]
                ]
            ))
        else
            Json.Document(Web.Contents(url,
                [
                    Content = Text.ToBinary(scrollID),
                    Headers=[
                        #"Authorization"="Basic <key here>",
                        #"Content-Type"="application/json"
                    ]
                ]
            )),
        ParsedResults = Table.FromList(Results[hits][hits], Splitter.SplitByNothing(), null, null, ExtraValues.Error),

        Return = if (Counter < scrollCount) then
            ParsedResults & RecursiveFetch(url, scrollCount scrollID, Counter)
        else
            ParsedResults
    in
        Return
in
    RecursiveFetch

这一切都在 Power BI Desktop 中完美运行,但是当我将其发布到 Web 应用程序时,我得到了上面显示的错误。

我已经在我的网关集群中手动设置了一个数据源,该数据源使用手动创建的查询使用的相同凭据很好地连接到 URL。

我如何让这一切正常工作?有什么我错过的吗?

标签: powerbipowerbi-desktopmpowerbi-datasource

解决方案


这一切都在 Power BI Desktop 中完美运行,但是当我将其发布到 Web 应用程序时,我得到了上面显示的错误。

要解决这个问题,Web.Contents需要使用options[RelativePath]options[Query](或Content用于 HTTP POST)

原本的:

"https://data.gov.uk/api/3/action/package_search?q=" & Term

将使用:

let
    BaseUrl = "https://data.gov.uk",
    Options = [
        RelativePath = "/api/3/action/package_search",
        Headers = [
            Accept="application/json"
        ],
        Query = [
            q = Term
        ]

    ],
    // wrap 'Response' in 'Binary.Buffer' if you are using it multiple times
    response = Web.Contents(BaseUrl, Options),
    buffered = Binary.Buffer(response),
    response_metadata = Value.Metadata(response),
    status_code = response_metadata[Response.Status],
    from_json = Json.Document(final_result)
in
    from_json

该参数url将是可能的最小 url,否则服务会认为您的动态请求实际上没有改变——导致原始刷新错误。


推荐阅读