Dela via


TripPin del 2 – Dataanslutning för en REST-tjänst

Den här självstudien i flera delar beskriver hur du skapar ett nytt datakällans tillägg för Power Query. Självstudien är avsedd att utföras sekventiellt – varje lektion bygger på anslutningsappen som skapades i föregående lektioner och lägger stegvis till nya funktioner i anslutningsappen.

I den här lektionen kommer du att:

  • Skapa en basfunktion som anropar ett REST-API med hjälp av Web.Contents
  • Lär dig hur du anger begärandehuvuden och bearbetar ett JSON-svar
  • Använd Power BI Desktop för att omvandla svaret till ett användarvänligt format

Den här lektionen konverterar den OData-baserade anslutningsappen för TripPin-tjänsten (som skapades i föregående lektion) till en anslutningsapp som liknar något du skulle skapa för alla RESTful-API:er. OData är ett RESTful-API, men ett med en fast uppsättning konventioner. Fördelen med OData är att det tillhandahåller ett schema, datahämtningsprotokoll och ett standardfrågespråk. Om vi tar bort användningen av OData.Feed måste vi själva skapa dessa funktioner i anslutningsappen.

Sammanfattning av OData-anslutningsappen

Innan du tar bort OData-funktionerna från anslutningsappen ska vi göra en snabb genomgång av vad den gör för närvarande (främst i bakgrunden) för att hämta data från tjänsten.

Öppna TripPin-tilläggsprojektet från del 1 i Visual Studio Code. Öppna frågefilen och klistra in följande fråga:

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

Öppna Fiddler och utvärdera sedan den aktuella Power Query-filen i Visual Studio Code.

I Fiddler finns det tre begäranden till servern:

Fiddler OData-begäranden.

  • /Me– den faktiska URL:en som du begär.
  • /$metadata– ett anrop som automatiskt görs av OData.Feed funktionen för att fastställa schema och ange information om svaret.
  • /Me/BestFriend— ett av fälten som (ivrigt) drogs när du listade singletonen /Me. I det här fallet resulterade anropet i status 204 No Content .

M utvärdering är mestadels lat. I de flesta fall hämtas/hämtas datavärden endast när de behövs. Det finns scenarier (till exempel fallet /Me/BestFriend) där ett värde hämtas ivrigt. Detta tenderar att inträffa när typinformation behövs för en medlem, och motorn har inget annat sätt att fastställa typen än att hämta värdet och inspektera det. Att göra saker lata (dvs. undvika ivriga hämtningar) är en av de viktigaste aspekterna för att göra en M-anslutningsapp presterande.

Observera de begärandehuvuden som skickades tillsammans med begäranden och JSON-formatet för svaret på /Me-begäran.

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

När frågan är klar med utvärderingen bör PQTest-resultatfönstret visa postvärdet för Me-singletonen.

OData-resultat.

Om du jämför fälten i utdatafönstret med fälten som returneras i JSON-råsvaret ser du ett matchningsfel. Frågeresultatet har andra fält (Friends, Trips, GetFriendsTrips) som inte visas någonstans i JSON-svaret. Funktionen OData.Feed läggs automatiskt till i posten baserat på schemat som returneras av $metadata. Det här är ett bra exempel på hur en anslutningsapp kan utöka och/eller formatera om svaret från tjänsten för att ge en bättre användarupplevelse.

Skapa en grundläggande REST-anslutningsapp

Nu ska du lägga till en ny exporterad funktion i anslutningsappen som anropar Web.Contents.

För att kunna göra lyckade webbbegäranden till OData-tjänsten måste du dock ange några OData-standardhuvuden. Det gör du genom att definiera en gemensam uppsättning rubriker som en ny variabel i anslutningsappen:

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

Du ändrar implementeringen av funktionen TripPin.Feed så att den i stället för att använda OData.Feedanvänder Web.Contents för att göra en webbbegäran och parsar resultatet som ett JSON-dokument.

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

Kom ihåg att skapa anslutningsappen nu när du har gjort ändringar i anslutningsfilen. Sedan kan du utvärdera frågefilen (TripPin.query.pq). Resultatet av /Me-posten liknar nu den råa JSON som du såg i Fiddler-begäran.

Om du tittar på Fiddler när du kör den nya funktionen ser du också att utvärderingen nu gör en enda webbbegäran i stället för tre. Grattis – du har uppnått en prestandaökning på 300 %! Nu har du förlorat all typ- och schemainformation, men du behöver inte fokusera på den delen ännu.

Uppdatera din fråga för att få åtkomst till några av TripPin-entiteterna/tabellerna, till exempel:

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

Du ser att sökvägarna som användes för att returnera snyggt formaterade tabeller nu returnerar ett värdefält på toppnivå med en inbäddad [lista]. Du måste göra några omvandlingar av resultatet för att göra det användbart för slutanvändaranvändningsscenarier.

Visa en lista över resultat.

Redigera omvandlingar i Power Query

Även om det är möjligt att skapa dina M-transformeringar för hand föredrar de flesta att använda Power Query för att forma sina data. Du öppnar tillägget i Power BI Desktop och använder det för att utforma frågor för att omvandla utdata till ett mer användarvänligt format. Återskapa lösningen, kopiera den nya tilläggsfilen till katalogen Custom Data Anslut ors och starta om Power BI Desktop.

Starta en ny tom fråga och klistra in följande i formelfältet:

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

Se till att inkludera =-tecknet.

Ändra utdata tills det ser ut som den ursprungliga OData-feeden – en tabell med två kolumner: AirlineCode och Name.

Formaterade flygbolag.

Den resulterande frågan bör se ut ungefär så här:

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

Ge frågan ett namn ("Flygbolag").

Skapa en ny tom fråga. Den här gången använder du TripPin.Feed funktionen för att komma åt entiteten /Airports. Använd transformeringar tills du får något som liknar den resurs som visas nedan. Matchande fråga finns också nedan– ge även frågan ett namn ("Flygplatser").

Formaterade flygplatser.

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"

Du kan upprepa den här processen för fler sökvägar under tjänsten. När du är klar går du vidare till nästa steg för att skapa en (mock) navigeringstabell.

Simulera en navigeringstabell

Nu ska du skapa en tabell (med M-kod) som visar dina snyggt formaterade TripPin-entiteter.

Starta en ny tom fråga och ta upp Avancerad redigerare.

Klistra in följande fråga:

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

Om du inte har angett inställningen Sekretessnivåer till "Ignorera alltid sekretessnivåinställningar" (kallas även "Snabb kombination") visas en sekretessfråga.

Brandvägg.

Sekretessfrågor visas när du kombinerar data från flera källor och ännu inte har angett någon sekretessnivå för en eller flera källor. Välj knappen Fortsätt och ange sekretessnivån för den översta källan till Offentlig.

Sekretess.

Välj Spara så visas tabellen. Även om detta inte är en navigeringstabell ännu, ger det de grundläggande funktioner du behöver för att göra den till en i en efterföljande lektion.

FakeNav.

Datakombinationskontroller utförs inte vid åtkomst till flera datakällor inifrån ett tillägg. Eftersom alla anrop från datakällan som görs från tillägget ärver samma auktoriseringskontext antas de vara "säkra" att kombinera. Ditt tillägg kommer alltid att behandlas som en enda datakälla när det gäller regler för datakombination. Användarna skulle fortfarande få vanliga sekretessfrågor när de kombinerar din källa med andra M-källor.

Om du kör Fiddler och väljer knappen Uppdatera förhandsversion i Power Query-redigeraren noterar du de separata webbbegärandena för varje objekt i navigeringstabellen. Detta indikerar att en ivrig utvärdering pågår, vilket inte är idealiskt när du skapar navigeringstabeller med många element. Efterföljande lektioner visar hur du skapar en lämplig navigeringstabell som stöder lat utvärdering.

Slutsats

Den här lektionen visade hur du skapar en enkel anslutningsapp för en REST-tjänst. I det här fallet har du omvandlat ett befintligt OData-tillägg till ett standard-REST-tillägg (med web.contents), men samma begrepp gäller om du skapar ett nytt tillägg från grunden.

I nästa lektion tar du frågorna som skapades i den här lektionen med hjälp av Power BI Desktop och omvandlar dem till en sann navigeringstabell i tillägget.

Nästa steg

TripPin Del 3 – Navigeringstabeller