Megosztás a következőn keresztül:


TripPin 2. rész – Adatösszekötő REST szolgáltatáshoz

Ez a többrészes oktatóanyag a Power Query új adatforrásbővítményének létrehozását ismerteti. Az oktatóanyagot egymás után kell elvégezni – minden lecke az előző leckékben létrehozott összekötőre épül, és növekményesen új képességeket ad hozzá az összekötőhöz.

Ebben a leckében a következőt fogja:

  • Alapfüggvény létrehozása, amely meghívja a REST API-t a Web.Contents használatával
  • Megtudhatja, hogyan állíthat be kérelemfejléceket, és hogyan dolgozhatja fel a JSON-választ
  • A Power BI Desktop használata a válasz felhasználóbarát formátumba alakításához

Ez a lecke átalakítja a TripPin szolgáltatás OData-alapú összekötőjét (amelyet az előző leckében hoztak létre) egy olyan összekötővé, amely hasonló a RESTful API-hoz létrehozandóhoz. Az OData egy RESTful API, de rögzített konvencióval rendelkezik. Az OData előnye, hogy sémát, adatlekérési protokollt és szabványos lekérdezési nyelvet biztosít. Az OData.Feed használatának elvétele megköveteli, hogy ezeket a képességeket mi magunk építsük be az összekötőbe.

Az OData-összekötő összegzése

Mielőtt eltávolítja az OData-függvényeket az összekötőből, vessünk egy gyors áttekintést arról, hogy jelenleg mit végez (többnyire a színfalak mögött), hogy adatokat kérjünk le a szolgáltatásból.

Nyissa meg a TripPin bővítményprojektet a Visual Studio Code 1. részéből. Nyissa meg a Lekérdezés fájlt, és illessze be a következő lekérdezésbe:

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

Nyissa meg a Fiddlert, majd értékelje ki az aktuális Power Query-fájlt a Visual Studio Code-ban.

A Fiddlerben három kérés érkezett a kiszolgálóhoz:

Fiddler OData-kérelmek.

  • /Me– a ténylegesen kért URL-cím.
  • /$metadata— a függvény által automatikusan küldött hívás a OData.Feed séma meghatározására és a válaszra vonatkozó adatok beírására.
  • /Me/BestFriend— az egyik mező, amelyet (lelkesen) lekért, amikor a /Me singletont sorolta fel. Ebben az esetben a hívás állapotot 204 No Content eredményezett.

M értékelés többnyire lusta. A legtöbb esetben az adatértékek csak akkor lesznek lekérve/lekérve, amikor szükség van rájuk. Vannak olyan forgatókönyvek (például a /Me/BestFriend eset), ahol a rendszer lelkesen lekért egy értéket. Ez általában akkor fordul elő, ha egy tag típusadataira van szükség, és a motornak nincs más módja a típus meghatározására, mint az érték lekérése és vizsgálata. A lustaság (azaz a türelmetlen lekérések elkerülése) az M-összekötők teljesítményének egyik fő szempontja.

Jegyezze fel az elküldött kérelemfejléceket, valamint a /Me kérés válaszának JSON-formátumát.

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

Amikor a lekérdezés befejezi az értékelést, a PQTest eredményablakának meg kell jelennie a Me singleton rekordértékének.

OData-eredmények.

Ha összehasonlítja a kimeneti ablakban lévő mezőket a nyers JSON-válaszban visszaadott mezőkkel, akkor eltérést tapasztal. A lekérdezés eredménye más mezőkkel (Friends, , GetFriendsTrips) rendelkezik, Tripsamelyek nem jelennek meg sehol a JSON-válaszban. Az OData.Feed függvény automatikusan hozzáfűzi ezeket a mezőket a rekordhoz a $metadata által visszaadott séma alapján. Ez jó példa arra, hogy az összekötők hogyan bővíthetik és/vagy formázhatják a szolgáltatás válaszát a jobb felhasználói élmény érdekében.

Alapszintű REST-összekötő létrehozása

Most egy új exportált függvényt fog hozzáadni az összekötőhöz, amely meghívja a Web.Contents-t.

Ahhoz azonban, hogy sikeres webes kéréseket lehessen küldeni az OData szolgáltatásnak, be kell állítania néhány szabványos OData-fejlécet. Ezt úgy teheti meg, hogy egy közös fejléckészletet határoz meg új változóként az összekötőben:

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

Úgy módosíthatja a függvény implementációjátTripPin.Feed, hogy a web.contents OData.Feed helyett webkérelmet készítsen, és JSON-dokumentumként elemezhesse az eredményt.

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

Ne felejtse el létrehozni az összekötőt most, hogy módosította az összekötőfájlt. Ezután kiértékelheti a lekérdezésfájlt (TripPin.query.pq). A /Me rekord eredménye most hasonlít a Fiddler-kérelemben látott nyers JSON-ra.

Ha az új függvény futtatásakor megtekinti a Fiddlert, azt is láthatja, hogy a kiértékelés mostantól három helyett egyetlen webes kérést készít. Gratulálunk – 300%-os teljesítménynövekedést ért el! Elvesztette az összes típus- és sémainformációt, de erre a részre még nem kell összpontosítania.

Frissítse a lekérdezést néhány TripPin-entitás/tábla eléréséhez, például:

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

Megfigyelheti, hogy a szépen formázott táblák visszaadásához használt elérési utak mostantól egy legfelső szintű "érték" mezőt ad vissza beágyazott [Lista] értékkel. Az eredményen néhány átalakítást kell végrehajtania, hogy használható legyen a végfelhasználói használati forgatókönyvekhez.

Találatok listázása.

Átalakítások létrehozása a Power Queryben

Bár az M-átalakítások kézzel is létrehozhatók, a legtöbben inkább a Power Queryt használják az adataik alakítására. A bővítményt a Power BI Desktopban nyitja meg, és lekérdezések tervezésére használja, hogy a kimenetet felhasználóbarátabb formátummá alakítsa. Építse újra a megoldást, másolja az új bővítményfájlt a Custom Data Csatlakozás ors könyvtárba, és indítsa újra a Power BI Desktopot.

Indítsa el az új üres lekérdezést, és illessze be a következőt a szerkesztőlécre:

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

Ügyeljen arra, hogy a = jel szerepeljen benne.

A kimenetet addig módosíthatja, amíg az eredeti OData-hírcsatornához hasonló nem lesz – egy két oszlopból áll: AirlineCode és Name.

Formázott légitársaságok.

Az eredményként kapott lekérdezésnek így kell kinéznie:

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

Adjon nevet a lekérdezésnek ("Légitársaságok").

Hozzon létre egy új üres lekérdezést. Ezúttal használja a függvényt a TripPin.Feed /Airports entitás eléréséhez. Alkalmazza az átalakításokat, amíg az alábbi megosztáshoz hasonlót nem kap. Az egyező lekérdezés az alábbiakban is megtalálható – adjon nevet a lekérdezésnek ("Repülőterek") is.

Formázott repülőterek.

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"

Ezt a folyamatot megismételheti a szolgáltatás további elérési útjaihoz. Ha elkészült, lépjen egy (makett) navigációs tábla létrehozásának következő lépésére.

Navigációs táblázat szimulálása

Most egy táblát fog létrehozni (M-kód használatával), amely bemutatja a szépen formázott TripPin-entitásokat.

Indítsa el az új üres lekérdezést, és hozza létre a Speciális szerkesztő.

Illessze be a következő lekérdezésbe:

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

Ha nem állította be az Adatvédelmi szintek beállítást az "Adatvédelmi szint beállításainak mindig figyelmen kívül hagyása" (más néven "Gyors összevonás") beállításra, megjelenik egy adatvédelmi kérdés.

Tűzfal.

Az adatvédelmi kérdések akkor jelennek meg, ha több forrásból származó adatokat kombinál, és még nem adott meg adatvédelmi szintet egy vagy több forráshoz. Válassza a Folytatás gombot, és állítsa a legfelső forrás adatvédelmi szintjét nyilvánosra.

Adatvédelem.

Válassza a Mentés lehetőséget, és megjelenik a táblázat. Bár ez még nem navigációs táblázat, az alapszintű funkciókat biztosítja, amelyekre egy későbbi leckében szükség van.

FakeNav.

Az adatkombinációs ellenőrzések nem fordulnak elő több adatforrás bővítményen belüli elérésekor. Mivel a bővítményen belülről indított összes adatforrás-hívás ugyanazt az engedélyezési környezetet örökli, feltételezzük, hogy ezek "biztonságosak". A bővítmény mindig egyetlen adatforrásként lesz kezelve, amikor adatkombinációs szabályokról van szó. A felhasználók továbbra is megkapják a szokásos adatvédelmi utasításokat, amikor a forrást más M-forrásokkal kombinálják.

Ha a Fiddlert futtatja, és a Lekérdezésszerkesztő a Frissítés előnézete gombra kattint, jegyezze fel a navigációs táblázat egyes elemeire vonatkozó külön webes kéréseket. Ez azt jelzi, hogy egy lelkes értékelés zajlik, ami nem ideális a navigációs táblák több elemből álló létrehozásakor. A következő leckék bemutatják, hogyan hozhat létre megfelelő navigációs táblázatot, amely támogatja a lusta értékelést.

Összegzés

Ez a lecke bemutatta, hogyan hozhat létre egyszerű összekötőt egy REST-szolgáltatáshoz. Ebben az esetben egy meglévő OData-bővítményt szabványos REST-bővítménysé alakított (a Web.Contents használatával), de ugyanezek a fogalmak érvényesek, ha teljesen új bővítményt hozott létre.

A következő leckében az ebben a leckében létrehozott lekérdezéseket a Power BI Desktop használatával fogja elvégezni, és a bővítményen belül valódi navigációs táblázattá alakíthatja őket.

Következő lépések

TripPin 3. rész – Navigációs táblázatok