Jaa


TripPin-osa 2 – Tietoliitin REST-palvelulle

Tässä moniosaisessa opetusohjelmassa käsitellään uuden tietolähdelaajennuksen luomista Power Querylle. Opetusohjelma on tarkoitus tehdä järjestyksessä – jokainen oppitunti perustuu aiemmilla oppitunneilla luotuun liittimeen ja lisää uusia ominaisuuksia liittimeen.

Tällä oppitunnilla:

  • Luo perusfunktio, joka kutsuu REST-ohjelmointirajapintaa käyttämällä Web.Contentsiä
  • Opi määrittämään pyynnön otsikot ja käsittelemään JSON-vastaus
  • Vastauksen voi vääntää käyttäjäystävälliseen muotoon Power BI Desktopin avulla

Tämä osio muuntaa TripPin-palvelun OData-pohjaisen liittimen (joka luotiin edellisessä osiossa) liittimeksi, joka muistuttaa jotakin, jonka loisit mille tahansa RESTful-ohjelmointirajapinnalle. OData on RESTful-ohjelmointirajapinta, jolla on kiinteät käytännöt. ODatan etu on, että se tarjoaa rakenteen, tietojen noutoprotokollan ja vakiokyselykielen. OData.Feed-kohteen käytön vieminen pois edellyttää, että rakennamme nämä ominaisuudet itse liittimeen.

OData-liittimen yhteenveto

Ennen kuin poistat OData-funktiot liittimestä, käydäänpä läpi, mitä se tällä hetkellä tekee (useimmiten taustalla) tietojen noutamiseksi palvelusta.

Avaa TripPin-laajennusprojekti Visual Studio Coden osasta 1 . Avaa kyselytiedosto ja liitä se seuraavaan kyselyyn:

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

Avaa Fiddler ja arvioi sitten nykyinen Power Query -tiedosto Visual Studio Codessa.

Fiddlerissä palvelimeen tulee kolme pyyntöä:

Fiddler OData -pyynnöt.

  • /Me– todellinen URL-osoite, jota pyydät.
  • /$metadata— funktion automaattisesti tekemä kutsu, jonka avulla OData.Feed määritetään vastauksen rakenne ja tyyppitiedot.
  • /Me/BestFriend— yksi kentistä, jotka (innokkaasti) vedettiin, kun luetteloit /Me-singletonin. Tässä tapauksessa kutsun tulos oli 204 No Content tila.

M-arviointi on enimmäkseen laiska. Useimmissa tapauksissa tietoarvot noudetaan/noudetaan vain, kun niitä tarvitaan. On olemassa skenaarioita (kuten /Me/BestFriend-tapaus), joissa arvo vedetään innokkaasti. Näin käy usein, kun jäsenelle tarvitaan tyyppitietoja eikä moduulilla ole muuta tapaa määrittää tyyppiä kuin hakea ja tarkastaa se. Asioiden laiskottelu (eli innokkaiden pull-vetojen välttäminen) on yksi keskeisistä näkökohdista, kun M-liittimestä tehdään suorituskykyinen.

Huomaa pyynnön otsikot, jotka lähetettiin yhdessä pyyntöjen kanssa, sekä /Me-pyynnön vastauksen JSON-muoto.

{
  "@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
}

Kun kysely on suoritettu, PQTest-tulosikkunassa pitäisi näkyä Me-singletonin tietuearvo.

OData-tulokset.

Jos vertaat tulosikkunan kenttiä JSON-raakavastauksen palauttaihin kenttiin, huomaat ristiriidan. Kyselyn tuloksessa on muita kenttiä (Friends, Trips, GetFriendsTrips), joita ei näy missään JSON-vastauksessa. OData.Feed-funktio liittää nämä kentät automaattisesti tietueeseen $metadata palauttaman rakenteen perusteella. Tämä on hyvä esimerkki siitä, miten liitin voi laajentaa ja/tai muotoilla vastauksen uudelleen palvelusta paremman käyttökokemuksen tarjoamiseksi.

Perus-REST-liittimen luominen

Lisäät nyt liittimeesi uuden viedyn funktion, joka kutsuu Web.Contents-funktiota.

Onnistuneiden verkkopyyntöjen tekeminen OData-palveluun vaatii kuitenkin joidenkin OData-vakiootsikoiden määrittäminen. Voit tehdä tämän määrittämällä yleisen otsikkojoukon uutena muuttujana liittimessäsi:

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

Muutat funktion toteutusta siten, että sen käyttämisen OData.FeedTripPin.Feed sijaan se käyttää Web.Contents-sisältöä verkkopyynnön tekemiseen ja jäsentää tuloksen JSON-asiakirjana.

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

Muista luoda liitin nyt, kun olet tehnyt muutoksia liitintiedostoon. Sen jälkeen voit arvioida kyselytiedoston (TripPin.query.pq). /Me-tietueen tulos muistuttaa nyt fiddler-pyynnössä näkemääsi raakaa JSON-tiedostoa.

Jos katsot Fiddleria uutta funktiota suoritettaessa, huomaat myös, että arviointi tekee nyt yhden verkkopyynnön kolmen sijaan. Onnittelut – suorituskyvyn on saavutettu 300 % lisäys! Olet nyt menettänyt kaikki tyyppi- ja rakennetiedot, mutta tähän osaan ei tarvitse vielä keskittyä.

Päivitä kyselysi käyttämään joitakin TripPin-entiteettejä/-taulukoita, kuten:

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

Huomaat, että polut, joita käytettiin palauttamaan kauniisti muotoillut taulukot, palauttavat nyt ylimmän tason "arvo"-kentän, jossa on upotettu [Luettelo]. Sinun täytyy tehdä joitakin muunnoksia tuloksesta, jotta se on käyttökelpoinen loppukäyttäjän kulutusskenaarioita varten.

Luettelotulokset.

Muunnosten luominen Power Queryssa

Vaikka M-muunnoksia voikin luoda käsin, useimmat käyttävät mieluummin Power Queryä tietojensa muotoiluun. Avaat laajennuksen Power BI Desktopissa ja käytät sitä kyselyiden suunnitteluun, jotta tuloste muuttuu käyttäjäystävällisemmäksi. Muodosta ratkaisu uudelleen, kopioi uusi laajennustiedosto Custom Data Näyttöyhteys ors -hakemistoon ja käynnistä Power BI Desktop uudelleen.

Käynnistä uusi tyhjä kysely ja liitä kaavariville seuraavat:

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

Muista sisällyttää =-merkki.

Käsittele tulosta, kunnes se näyttää alkuperäiseltä OData-syötteeltä – taulukolta, jossa on kaksi saraketta: AirlineCode ja Name.

Muotoillut lentoyhtiöt.

Tuloksena saatavan kyselyn pitäisi näyttää suunnilleen tältä:

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

Anna kyselylle nimi ("Airlines").

Luo uusi tyhjä kysely. Tällä kertaa voit käyttää -funktiota TripPin.Feed /Airports-entiteettiin. Käytä muunnoksia, kunnes saat jotakin samankaltaista kuin alla olevassa jako. Vastaava kysely löytyy myös alta – anna tälle kyselylle nimi ("Lentokentät").

Muotoillut lentokentät.

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"

Voit toistaa tämän prosessin, jos palvelussa on enemmän polkuja. Kun olet valmis, siirry seuraavaan (pilkkaavan) siirtymistaulukon luomisen vaiheeseen.

Siirtymistaulukon simulointi

Nyt aiot luoda taulukon (käyttäen M-koodia), joka esittää hienosti muotoillut TripPin-entiteetit.

Käynnistä uusi tyhjä kysely ja tuo Laajennettu editori.

Liitä seuraavaan kyselyyn:

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

Jos et ole määrittänyt Yksityisyystasot-asetukseksi "Ohita aina yksityisyystason asetukset" (tunnetaan myös nimellä "Nopea yhdistäminen"), näkyviin tulee tietosuojakehote.

Palomuuri.

Tietosuojakehotteet tulevat näkyviin, kun yhdistät tietoja useista lähteistä, etkä ole vielä määrittänyt yksityisyystasoa yhdelle tai useammalle lähteelle. Valitse Jatka-painike ja määritä ylimmän lähteen yksityisyystasoksi Julkinen.

Yksityisyyden.

Valitse Tallenna , jolloin taulukkosi tulee näkyviin. Vaikka tämä ei vielä ole siirtymistaulukko, se tarjoaa perustoiminnon, jota tarvitset sen muuttamiseen sellaiseksi myöhemmällä oppitunnilla.

FakeNav.

Tietoyhdistelmätarkistuksia ei tehdä, kun käytetään useita tietolähteitä laajennuksen kautta. Koska kaikki laajennuksesta tehdyt tietolähdekutsut perivät saman valtuutuskontekstin, on oletettu, että ne on "turvallinen" yhdistää. Laajennustasi käsitellään aina yksittäisenä tietolähteenä, kun kyse on tietojen yhdistämisen säännöistä. Käyttäjät saavat silti säännöllisesti tietosuojakehotteita yhdistäessään lähteesi muihin M-lähteisiin.

Jos suoritat Fiddlerin ja valitset Päivitä esikatselu -painikkeen Kyselyeditori, huomaa erilliset verkkopyynnöt kullekin siirtymistaulukon kohteelle. Tämä ilmaisee sitä, että tehdään laajennettu arviointi, mikä ei ole ihanteellinen luotaessa siirtymistaulukoita, joissa on useita elementtejä. Myöhemmissä oppitunneissa näytetään, miten voit luoda oikean siirtymistaulukon, joka tukee laiskuutta arviointia.

Yhteenveto

Tällä oppitunnilla opit luomaan yksinkertaisen liittimen REST-palveluun. Tässä tapauksessa muutit olemassa olevan OData-laajennuksen vakio-REST-laajennukseksi (Web.Contentsin avulla), mutta samat käsitteet pätevät, jos luot uuden laajennuksen alusta alkaen.

Seuraavalla oppitunnilla suoritat tällä oppitunnilla luodut kyselyt Power BI Desktopin avulla ja muutat ne laajennuksen sisäiseksi todelliseksi siirtymistaulukoksi.

Seuraavat vaiheet

TripPin,osa 3 – Siirtymistaulukot