Zdieľať cez


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 rozšírenia TripPin z 1 . časti v programe Visual Studio Code. 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 vyhodnotte aktuálny súbor Power Query v programe Visual Studio Code.

V aplikácii Fiddler existujú tri požiadavky na server:

Požiadavky nástroja Fiddler OData.

  • /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ýsledkov PQTest by sa mala zobraziť hodnota Záznam pre jednotonové znamienko Me.

Výsledky funkcie OData.

Ak porovnáte polia vo výstupnom okne s poľami vrátenými v nespracovej odpovedi JSON, zistíte nesúlad. Výsledok dotazu má ďalšie polia (Friends, Trips, ), GetFriendsTripsktoré sa nikde v odpovedi JSON nezobrazujú. 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 TripPin.Feed funkcie zmeníte tak, aby namiesto používania OData.Feedpoužívala web.contents na vytvorenie webovej požiadavky a analyzuje výsledok ako dokument JSON.

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

Nezabudnite vytvoriť konektor teraz, keď ste v súbore konektora vykonali zmeny. Potom môžete vyhodnotiť súbor dotazu (TripPin.query.pq). 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! Teraz ste stratili všetky informácie o type a schéme, ale už sa na túto časť nemusíte 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]. Vo výsledku budete musieť vykonať niekoľko transformácií, vďaka čomu sa budú dať použiť pre scenáre využitia pre koncových používateľov.

Zoznam výsledkov.

Vytváranie transformácií v doplnku Power Query

Aj keď je možné vytvárať transformácie V jazyku M je možné ručne, väčšina ľudí radšej používa Power Query na tvarovanie údajov. 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.

Formátované letecké spoločnosti.

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á"),

Formátované letiská.

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ť, ak chcete v službe použiť viac ciest. 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.

Príkazy na ochranu osobných údajov sa zobrazia, keď kombinujete údaje z viacerých zdrojov, a ešte ste nezadali úroveň ochrany osobných údajov pre jeden alebo viacero zdrojov. Vyberte tlačidlo Pokračovať a úroveň ochrany osobných údajov horného zdroja nastavte na možnosť Verejné.

Ochrana osobných údajov.

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.

FalošnýNav.

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 z rozšírenia dedia rovnaký kontext oprávnenia, predpokladá sa, že s kombináciou majú "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 v Editor Power Query vyberiete tlačidlo Obnoviť ukážku, všimnite si samostatné webové žiadosti 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 navigačnú tabuľku, 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