TripPin časť 2 – konektor údajov pre službu REST

Tento kurz s viacerými časťami sa zaoberá vytváraním nového rozšírenia zdroja údajov pre Power Query. Tento kurz sa má uskutočniť postupne – každá lekcia vychádza z konektora vytvoreného v predchádzajúcich lekciách a postupne pridáva nové možnosti do konektora.

V tejto lekcii:

  • Vytvorenie základnej funkcie, ktorá volá rozhranie REST API pomocou lokality Web.Contents
  • Zistite, ako nastaviť hlavičky požiadaviek a spracovať odpoveď JSON
  • Použitie aplikácie Power BI Desktop na transformáciu odpovede do používateľsky príjemného formátu

Táto lekcia konvertuje konektor založený na OData pre službu TripPin (vytvorenú v predchádzajúcej lekcii) na konektor, ktorý sa podobá niečomu, čo by ste vytvorili pre akékoľvek rozhranie RESTful API. OData je restful API, ale ide o rozhranie s pevnou množinou konvencií. Výhodou funkcie OData je, že poskytuje schému, protokol načítania údajov a štandardný jazyk dotazov. Ak odstránime používanie informačného kanála OData, bude sa od nás vyžadovať, aby sme tieto možnosti vytvorili v konektore sami.

Rekapitulácia konektora OData

Pred odstránením funkcií OData z konektora si rýchlo zopakujme, čo aktuálne robí (väčšinou v zákulisí) na načítanie údajov zo služby.

Otvorte projekt Konektor TripPin z 1 . časti v aplikácii Visual Studio. Otvorte súbor dotazu a prilepte ho do nasledujúceho dotazu:

TripPin.Feed("https://services.odata.org/v4/TripPinService/Me")

Otvorte Aplikáciu Fiddler a potom vyberte tlačidlo Spustiť vo Visual Studiu.

V aplikácii Fiddler sa na serveri zobrazia tri požiadavky:

Fiddler OData requests.

  • /Me—skutočná URL adresa, ktorú požadujete.
  • /$metadata— volanie automaticky vykonané funkciou OData.Feed na určenie schémy a typu informácií o odpovedi.
  • /Me/BestFriend— jedno z polí, ktoré bolo (dychtivo) vyžiadané, keď ste uviedli singleton /Me. V tomto prípade volanie malo 204 No Content za následok stav.

Hodnotenie jazyka M je väčšinou lenivé. Vo väčšine prípadov sa hodnoty údajov načítajú alebo vyžiadajú len v prípade potreby. Existujú scenáre (ako napríklad prípad /Me/BestFriend), v ktorých sa hodnota netrpezlivo načíta. Zvyčajne k tomu dochádza vtedy, keď člen potrebuje informácie o type, a nástroj nemá iný spôsob, ako určiť typ, ako načítať hodnotu a skontrolovať ju. Lenivé vytváranie vecí (to znamená vyhnúť sa nedočkavým ťahom) je jedným z kľúčových aspektov výkonu konektora jazyka M.

Všimnite si hlavičky požiadaviek, ktoré sa odoslali, spolu s požiadavkami a formátom JSON odpovede požiadavky /Me.

{
  "@odata.context": "https://services.odata.org/v4/TripPinService/$metadata#Me",
  "UserName": "aprilcline",
  "FirstName": "April",
  "LastName": "Cline",
  "MiddleName": null,
  "Gender": "Female",
  "Age": null,
  "Emails": [ "April@example.com", "April@contoso.com" ],
  "FavoriteFeature": "Feature1",
  "Features": [ ],
  "AddressInfo": [
    {
      "Address": "P.O. Box 555",
      "City": {
        "Name": "Lander",
        "CountryRegion": "United States",
        "Region": "WY"
      }
    }
  ],
  "HomeAddress": null
}

Keď sa dotaz dokončí vyhodnocovanie, v okne Výstup dotazu jazyka M by sa mala zobraziť hodnota Záznam pre jednotonové znamienko Me.

OData results.

Ak porovnáte polia vo výstupnom okne s poľami vrátenými v nespracovanej odpovedi JSON, všimnete si nesúlad. Výsledok dotazu obsahuje ďalšie polia (Friends, Trips, ), GetFriendsTripsktoré sa nezobrazujú nikde v odpovedi JSON. Funkcia OData.Feed automaticky pripojí tieto polia k záznamu na základe schémy vrátenej funkciou $metadata. Toto je dobrý príklad toho, ako môže konektor rozšíriť a/alebo zmeniť formátovanie odpovede zo služby, aby sa poskytlo lepšie používateľské prostredie.

Vytvorenie základného konektora REST

Teraz pridáte do konektora novú exportovanú funkciu, ktorá volá Web.Contents.

Ak však chcete vytvoriť úspešné webové požiadavky v službe OData, budete musieť nastaviť niektoré štandardné hlavičky funkcie OData. Urobíte to definovaním spoločnej množiny hlavičiek ako novej premennej v konektore:

DefaultRequestHeaders = [
    #"Accept" = "application/json;odata.metadata=minimal",  // column name and values only
    #"OData-MaxVersion" = "4.0"                             // we only support v4
];

Implementáciu funkcie TripPin.Feed zmeníte tak, aby namiesto používania OData.Feedpoužívala web.contents na vytvorenie webovej žiadosti a analyzuje výsledok ako dokument JSON.

TripPinImpl = (url as text) =>
    let
        source = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),
        json = Json.Document(source)
    in
        json;

Teraz si to môžete vyskúšať vo Visual Studiu pomocou súboru dotazu. Výsledok záznamu /Me teraz vyzerá ako nespracovaný kód JSON, ktorý ste videli v žiadosti Fiddler.

Ak pri spustení novej funkcie sledujete aplikáciu Fiddler, všimnete si tiež, že pri vyhodnotení sa teraz vykoná jedna webová žiadosť a nie tri. Blahoželáme – dosiahli ste 300 % zvýšenie výkonu! Samozrejme, teraz ste stratili všetky informácie o type a schéme, ale nemusíte sa ešte na túto časť sústrediť.

Aktualizujte dotaz a získajte prístup k niektorým entitám/tabuľkám TripPin, ako napríklad:

  • https://services.odata.org/v4/TripPinService/Airlines
  • https://services.odata.org/v4/TripPinService/Airports
  • https://services.odata.org/v4/TripPinService/Me/Trips

Všimnite si, že cesty, ktoré sa použili na vrátenie pekne formátovaných tabuliek, teraz vrátia pole najvyššej úrovne s vloženým zoznamom [Zoznam]. Na to, aby bol výsledok použiteľný pre scenáre služby Power BI, musíte vo výsledku vykonať niekoľko transformácií.

List results.

Vytváranie transformácií v doplnku Power Query

Aj keď je určite možné manuálne vytvárať transformácie v jazyku M, väčšina ľudí uprednostňuje tvarovanie údajov pomocou Power Query. Svoje rozšírenie otvoríte v aplikácii Power BI Desktop a použijete ho na navrhovanie dotazov, aby sa výstup premenil na používateľsky prehľadnejší formát. Zmeňte svoje riešenie, skopírujte nový súbor prípon do adresára Vlastné údaje Pripojenie or a znova spustíte Power BI Desktop.

Spustite nový prázdny dotaz a do riadka vzorcov prilepte toto:

= TripPin.Feed("https://services.odata.org/v4/TripPinService/Airlines")

Nezabudnite uviesť znamienko = .

Manipulovajte s výstupom, kým nebude vyzerať ako pôvodný informačný kanál OData – tabuľka s dvoma stĺpcami: AirlineCode a Name.

Formatted airlines.

Výsledný dotaz by mal vyzerať približne takto:

let
    Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/Airlines"),
    value = Source[value],
    toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    expand = Table.ExpandRecordColumn(toTable, "Column1", {"AirlineCode", "Name"}, {"AirlineCode", "Name"})
in
    expand

Zadajte názov dotazu ("Letecké spoločnosti").

Vytvorte nový prázdny dotaz. Tentoraz použite TripPin.Feed funkciu na prístup k entite /Airports . Použite transformácie, kým nedosiahnete niečo podobné ako zdieľanie zobrazené nižšie. Zodpovedajúci dotaz nájdete aj nižšie – zadajte tomuto dotazu tiež názov ("Letiská"),

Formatted airports.

let
    Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/Airports"),
    value = Source[value],
    #"Converted to Table" = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"Name", "IcaoCode", "IataCode", "Location"}, {"Name", "IcaoCode", "IataCode", "Location"}),
    #"Expanded Location" = Table.ExpandRecordColumn(#"Expanded Column1", "Location", {"Address", "Loc", "City"}, {"Address", "Loc", "City"}),
    #"Expanded City" = Table.ExpandRecordColumn(#"Expanded Location", "City", {"Name", "CountryRegion", "Region"}, {"Name.1", "CountryRegion", "Region"}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded City",{{"Name.1", "City"}}),
    #"Expanded Loc" = Table.ExpandRecordColumn(#"Renamed Columns", "Loc", {"coordinates"}, {"coordinates"}),
    #"Added Custom" = Table.AddColumn(#"Expanded Loc", "Latitude", each [coordinates]{1}),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Longitude", each [coordinates]{0}),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"coordinates"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Columns",{{"Name", type text}, {"IcaoCode", type text}, {"IataCode", type text}, {"Address", type text}, {"City", type text}, {"CountryRegion", type text}, {"Region", type text}, {"Latitude", type number}, {"Longitude", type number}})
in
    #"Changed Type"

Tento proces môžete zopakovať aj pre ďalšie cesty v rámci služby. Keď budete pripravení, prejdite na ďalší krok vytvorenia (maketovania) navigačnej tabuľky.

Simulácia navigačnej tabuľky

Teraz vytvoríte tabuľku (pomocou kódu jazyka M), ktorá predstavuje vaše pekne formátované entity TripPin.

Začnite nový prázdny dotaz a vyvolajte Rozšírený editor.

Prilepte do nasledujúceho dotazu:

let
    source = #table({"Name", "Data"}, {
        { "Airlines", Airlines },
        { "Airports", Airports }
    })
in
    source

Ak ste nenastavili nastavenie Úrovne ochrany osobných údajov na možnosť Vždy ignorovať nastavenia úrovne ochrany osobných údajov (nazýva sa aj "Rýchlo kombinovať"), zobrazí sa výzva na ochranu osobných údajov.

Firewall.

Pri kombinovaní údajov z viacerých zdrojov sa zobrazia výzvy na ochranu osobných údajov a ešte ste nezadali úroveň ochrany osobných údajov zdrojov. Vyberte tlačidlo Pokračovať a úroveň ochrany osobných údajov horného zdroja nastavte na možnosť Verejné.

Privacy.

Vyberte položku Uložiť a zobrazí sa tabuľka. Hoci to ešte nie je tabuľka navigácie, poskytuje základné funkcie, ktoré potrebujete v nasledujúcej lekcii zmeniť na jednu.

FakeNav.

Kontroly kombinácie údajov sa nevyskytujú pri prístupe k viacerým zdrojom údajov v rámci rozšírenia. Keďže všetky volania zdrojov údajov uskutočnené z rozšírenia dedia rovnaký kontext oprávnenia, predpokladá sa, že s kombináciou sú "bezpečné". Pokiaľ ide o pravidlá kombinácie údajov, vaše rozšírenie sa bude vždy považovať za jeden zdroj údajov. Používatelia budú pri kombinovaní zdroja s inými zdrojmi M stále dostávať pravidelné výzvy na ochranu osobných údajov.

Ak spustíte aplikáciu Fiddler a kliknete na tlačidlo Obnoviť ukážku v Editor Power Query, všimnete si samostatné webové požiadavky pre každú položku v navigačnej tabuľke. To znamená, že dochádza k nedočkavého vyhodnoteniu, čo nie je ideálne pri vytváraní navigačných tabuliek s mnohými prvkami. V nasledujúcich lekciách sa dozviete, ako vytvoriť správnu tabuľku navigácie, ktorá podporuje lenivé vyhodnocovanie.

Záver

V tejto lekcii sme sa naučili, ako vytvoriť jednoduchý konektor pre službu REST. V tomto prípade ste zmenili existujúce rozšírenie OData na štandardné rozšírenie REST (pomocou funkcie Web.Contents), ale rovnaké pojmy platia aj v prípade, ak vytvárate nové rozšírenie úplne od začiatku.

V ďalšej lekcii si prejdete dotazy vytvorené v tejto lekcii pomocou Power BI Desktopu a zmeníte ich na tabuľku s navigáciou, ktorá je v danom rozšírení pravdivá.

Ďalšie kroky

TripPin Part 3 – navigačné tabuľky