首页 > 解决方案 > 有没有办法使用 Power Query 获取具有 Power BI 的许多 API 密钥的 API 数据?

问题描述

请参阅下面的解决方案!

我必须从一个具有多个 API 密钥的 API 获取数据到 PowerBI。每个 Key 都可以让我从组织的不同分支获取数据。数据结构始终相同。因为我有数十个 API 密钥,所以我想用 Power Query 来做这件事。经过几个小时的谷歌搜索,我的大脑过热了:)。

我拥有的是 API URL 和 API 密钥列表。没有分页。我可以毫无问题地使用一个 API 密钥获取数据。

我想做什么:

  1. 就是从list中获取一个API key,作为变量放入Json-call(Json.Document)中
  2. 获取 Json 并将其加入到先前的(如果存在)
  3. 只要列表中有 API 密钥,就迭代它
  4. 将 Json 放到一张桌子上

结果将有一个表,其中包含来自所有组织分支的数据。

我设法发现这可以使用 List.Generate -function 来完成,但我被困在那里。

let
    KeyList = {"abcd1234","bcde1234","defg1234"}, //list of API Keys 
    Source = "https://something.com/api/v1/" & "Items", // API URL
    Position = 0, // Starting position for API Key list

    GetJson =
        (Source, Position) as record =>
            let
                ApiData = Json.Document(Web.Contents(Source, [Headers=[#"X-API-Key"=KeyList{Position}]]))
            in
                ApiData,
    AllJson = 
        List.Generate (
            () => [i=0, Fetch = GetJson(Source,Position)],
            each [i]<=List.Count(KeyList),
            each [i=[i]+1, Fetch = GetJson([Source][i])],
            each [Fetch]
        ),
    Table = Table.FromList(AllJson, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    Table

这个 Power Query 没有给出任何语法错误,但它的逻辑有问题。它产生了一个包含四个错误的列表,其中第一个表示将列表转换为记录时遇到问题,其余三个是关于找不到字段 Source。

抱歉,我不能提供真正的 API 网址和密钥。

有任何想法吗?提前致谢!


在 Dreekun 的帮助下,我设法解决了这个问题。如果有人感兴趣,我会将更正后的“代码”放在下面。

let
    KeyList = {"abcd1234","bcde1234","defg1234"}, //list of API Keys 
    Position = 0, // Starting position for API Key list

    GetJson =
        (Position) =>
            let
                ApiData = Json.Document(Web.Contents("https://something.com/api/v1/" & "Items", [Headers=[#"X-API-Key"=KeyList{Position}]]))
            in
                ApiData,
    AllJson = 
        List.Generate (
            () => [i=1, Fetch = GetJson(Position)], // Note that counter i starts as 1, otherwise first key will be fetched twice
            each [i]<=List.Count(KeyList), // repeat until counter i is equal or greater than the length of key list
            each [i=[i]+1, Fetch = GetJson([i])] // add one to counter and fetch json data
        ),
    Table = Table.FromList(AllJson, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    Table

再次感谢 Dreekun 的帮助!!在这个例子中,有 3 个 API 密钥,但在现实生活中我有超过 50 个,所以这很有帮助!

标签: jsonapipowerbipowerqueryapi-key

解决方案


推荐阅读