Hente data fra API’er til Power BI

Jeg skal ikke skryte på meg å være noen Power BI superbruker (ennå), men dette vet jeg mange strever med. Siden jeg endelig har funnet en løsning, så ville jeg dele det.

Power BI kan hente data fra ett enormt antall kilder, også fra API’er som typisk gir data i JSON eller XML format. Ett problem mange, meg inkludert, har med dette er når du skal autentisere deg med ett eller annet token istedet for brukernavn og passord.

Det fungerer fint i Power BI Desktop, men idet du laster rapporten din opp til Power BI Desktop så slutter oppdateringer å fungere.

Her har jeg tatt eksempel i Statuspage.io fra Atlassian, siden det er ett reelt eksempel fra min hverdag. Vi ønsket å hente ut antall abonnementer på vår statusside og lage en rapport på utviklingen. Vi la inn URL’en til API’et og API nøkkelen i Power BI Desktop som beskrevet i dokumentasjonen til Microsoft:

Hente data fra Statuspage sitt API med Power BI Desktop.

Dette fungerer helt perfekt i Power BI Desktop. Du kan oppdatere data og stå i… men etter å ha laget en flott rapport og publisert den til Power BI Service (web), så fikk vi bare feilmeldinger i Power BI Service om at autentisering feilet. av det jeg kunne tolke av feilmeldingen, så hadde Power BI strippet vekk API nøkkelen.

Etter å ha brukt lang tid i diskusjonstråder (dette er ett problem mange strever med tydeligvis) og spurt vår lokale Microsoft-representant uten å ha kommet noen vei, fant jeg løsningen midt inne i en diskusjonstråd som tydeligvis flere hadde oversett. Uansett, den funka som en kule for meg!

Relative Path

Løsningen er altså å redigere Power Query M skriptet i Power BI Desktop og legge inn en relativ sti.

Det er en forutsetning for å få dette til å virke; Du må få en HTTP 200 på rot-mappen til domenet uten å logge inn, ellers vil Power BI tolke det som en feil og stoppe.

Let
   Source = Json.Document(Web.Contents("https://api.statuspage.io", [Headers=[Authorization="XXXXXXX-XXXX-XXX-XXXX-XXXXXXXX"], RelativePath="/v1/pages/XXXXXXXXX/subscribers.json"])),

Så det jeg har gjort i eksempelet her, er å først gå til rot-mappen, deretter legge på autoriseringen og ta resten av URL’en inn som en relativ sti. Dette «lurer» Power BI Service til å bruke header parameteret.

Hvis Power BI Service fortsatt klager på autorisering, bare velg «Anonymous» så vil det virke å sette opp auto-refresh.

Dette trikset har fungert for meg på to forskjellige API’er med forskjellige typer tokens 🙂

Statuspage.io

Hvis du kom til denne bloggposten for å finne ut hvordan bruke data fra Statuspage.io, så kan jeg godt dele resten av min Power Query M:

    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"id", "created_at"}, {"Column1.id", "Column1.created_at"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Expanded Column1",{{"Column1.created_at", type datetime}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{"Column1.id", "SubscriberID"}, {"Column1.created_at", "SubscribeDate"}}),
    #"Sorted Rows" = Table.Sort(#"Renamed Columns",{{"SubscribeDate", Order.Descending}})
in
    #"Sorted Rows"

Det dette skriptet her gjør, er å konvertere JSON-formatet til tabeller og generere overskrifter til kolonnene.

Sluttresultatet kan for eksempel bli en kjekk graf som daglig oppdateres automatisk med veksten i abonnenter:

Data fra

4 kommentarer om “Hente data fra API’er til Power BI”

  1. Like.
    Jeg har også slitt med dette og kom videre ved å velge Data Sources, clear global permissions. Da spurte Power BI etter ny nøkkel. Det kan hende du har en litt annen setting. 🙂

    Svar
  2. Vi har en utfordring hvor API token utløper etter 20min.
    Har derfor laget et script som henter ut ny nøkkel for hver spørring. Den brukes da som en variabel ved henting av data. Dette fungerer fint i desktop.
    Ved opplasting til Power BI service slutter derimot dette å fungere når token utløper. Virker da ikke som den kjører hele scriptet for å hente ut ny nøkkel igjen.
    Har du noen formening om hva som kan gjøres for å fikse det?

    Her er koden:

    let
    API = Json.Document(Web.Contents(«https://xxxx/api/logon/TakeAuthenticationToken?email= xxxx&password= xxxx», [Content=Text.ToBinary(«»)])),
    Result = API[Result],
    Token = Result[Token],

    content = "{

    «»entityType»»: «»Incident»»,
    «»page»»: 1,
    «»pageSize»»: 150,
    «»loadDynamicProperties»»: true,
    «»columns»»: [«»ReferenceNo»», «»BaseHeader»», «»CreatedDate»», «»BaseEntityStatus»», «»Priority»», «»BaseAgent»»],

    }»,

    vUrl = "https://xxxx/api/publicapi/getentitylistbyquery",
    Source = Json.Document(Web.Contents(vUrl, [Headers=[Authorization="bearer " & Token],Content=Text.ToBinary(content)])),
    Data = Source[Data],

    in
    Source

    Svar

Legg igjen en kommentar