Jaa


TripPin-osa 5 – Sivutus

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:

  • Sivutustuen lisääminen liittimeen

Monet Rest-ohjelmointirajapinnat palauttavat tietoja "sivuilta", mikä edellyttää, että asiakkaat tekevät useita pyyntöjä saadakseen tulokset yhteen. Vaikka sivutusta varten on joitakin yleisiä käytäntöjä (kuten RFC 5988), ne vaihtelevat yleensä ohjelmointirajapinnasta ohjelmointirajapintaan. Onneksi TripPin on OData-palvelu, ja OData-standardi määrittää tavan sivutusta käyttämällä odata.nextLink-arvoja , jotka palautetaan vastauksen leipätekstissä.

Liittimen aiempien iteraatioiden yksinkertaistamiseksi funktio ei ollut sivutietoinen.TripPin.Feed Se yksinkertaisesti jäsentää pyynnöstä palautetun JSON-kohteen ja muotoillut sen taulukoksi. OData-protokollaan perehtyneet ovat saattaneet huomata, että vastauksen muodosta tehtiin monia virheellisiä oletuksia (kuten olettaenvalue, että kenttä sisältää useita tietueita).

Tällä oppitunnilla parannat vastausten käsittelyn logiikkaa tekemällä siitä sivun tietoisen. Tulevat opetusohjelmat tekevät sivun käsittelystä vankempaa ja kykenee käsittelemään useita vastausmuotoja (mukaan lukien palvelun virheet).

Muistiinpano

Sinun ei tarvitse ottaa käyttöön omaa sivutuslogiikkaa OData.Feediin perustuvilla liittimillä, sillä se käsittelee kaiken puolestasi automaattisesti.

Sivutmisen tarkistusluettelo

Kun otat sivutustukea käyttöön, sinun on tiedettävä seuraavat asiat ohjelmointirajapinnastasi:

  • Miten voit pyytää seuraavaa tietosivua?
  • Edellyttääkö sivutusmekanismi arvojen laskemista, vai puratko vastauksen seuraavan sivun URL-osoitteen?
  • Mistä tiedät, milloin sivutus kannattaa lopettaa?
  • Liittyykö sivutusinniin parametreja, jotka sinun tulee ottaa huomioon? (esimerkiksi "sivun koko")

Vastaus näihin kysymyksiin vaikuttaa siihen, miten otat sivutuslogiikan käyttöön. Vaikka koodin uudelleenkäyttöä on jonkin verran sivutustoteutettavissa (kuten Table.GenerateByPagen käytössä, useimmat liittimet edellyttävät kuitenkin mukautettua logiikkaa).

Muistiinpano

Tämä osio sisältää OData-palvelun sivutuslogiikan, joka noudattaa tiettyä muotoa. Tarkista ohjelmointirajapintasi dokumentaatiosta, mitä muutoksia sinun on tehtävä liittimessäsi, jotta voit tukea sen sivutusmuotoa.

OData-sivutuksen yleiskatsaus

OData-sivutusta ohjaavat seuraavatLink-huomautukset, jotka sisältyvät vastauksen hyötykuormaan. SeuraavaLink-arvo sisältää seuraavan tietosivun URL-osoitteen. Tiedät, onko sinulla toinen tietosivu, etsimällä odata.nextLink kentän vastauksen uloimmaksi objektiksi. Jos kenttää ei ole odata.nextLink , olet lukenut kaikki tietosi.

{
  "odata.context": "...",
  "odata.count": 37,
  "value": [
    { },
    { },
    { }
  ],
  "odata.nextLink": "...?$skiptoken=342r89"
}

Joidenkin OData-palveluiden avulla asiakkaat voivat määrittää sivun enimmäiskokoasetuksen, mutta on palvelun asia, noudattaako se sitä vai ei. Power Queryn pitäisi pystyä käsittelemään minkä tahansa kokoisia vastauksia, joten sinun ei tarvitse huolehtia sivun kokoasetuksen määrittämisestä – voit tukea mitä tahansa, mitä palvelu heittää sinulle.

Lisätietoja palvelinpohjaisesta sivutumisesta on OData-määrityksessä.

TripPinin testaaminen

Ennen kuin korjaat sivutuksen toteutuksen, varmista laajennuksen nykyinen toiminta edellisessä opetusohjelmassa. Seuraava testikysely noutaa Ihmiset-taulukon ja lisää indeksisarakkeen nykyisen rivimäärän näyttämiseksi.

let
    source = TripPin.Contents(),
    data = source{[Name="People"]}[Data],
    withRowCount = Table.AddIndexColumn(data, "Index")
in
    withRowCount

Ota Fiddler käyttöön ja suorita kysely Power Query SDK:ssa. Huomaa, että kysely palauttaa kahdeksan riviä sisältävän taulukon (indeksi 0–7).

QueryWithoutPaging.

Jos tarkastelet fiddlerin vastauksen leipätekstiä, huomaat, että se itse asiassa sisältää @odata.nextLink kentän, mikä osoittaa, että saatavilla on enemmän tietosivuja.

{
  "@odata.context": "https://services.odata.org/V4/TripPinService/$metadata#People",
  "@odata.nextLink": "https://services.odata.org/v4/TripPinService/People?%24skiptoken=8",
  "value": [
    { },
    { },
    { }
  ]
}

Sivutus käyttöön TripPinille

Teet nyt seuraavat muutokset laajennukseen:

  1. Tuo yleinen Table.GenerateByPage funktio
  2. GetAllPagesByNextLink Lisää funktio, jota käytetään Table.GenerateByPage kaikkien sivujen liimaamiseen yhteen
  3. GetPage Lisää funktio, joka voi lukea yhden tietosivun
  4. Lisää funktio, joka GetNextLink poimii seuraavan URL-osoitteen vastauksesta
  5. Päivitä TripPin.Feed käyttämään uusia sivunlukuohjelman funktioita

Muistiinpano

Kuten aiemmin tässä opetusohjelmassa mainittiin, sivutuslogiikka vaihtelee tietolähteiden välillä. Tässä oleva toteutus yrittää erottaa logiikan funktioihin, joiden tulee olla uudelleenkäytettäviä lähteissä, jotka käyttävät vastauksessa palautettuja seuraavia linkkejä .

Table.GenerateByPage

Yhdistämme lähteen palauttamat (mahdollisesti) useat sivut yhdeksi taulukoksi käyttämällä -toimintoa Table.GenerateByPage. Tämän funktion argumenttina getNextPage on funktio, jonka pitäisi tehdä juuri se, mitä sen nimi ehdottaa: noutaa seuraavan tietosivun. Table.GenerateByPage kutsuu funktiota getNextPage toistuvasti, aina kun se välitetään, tulokset tuottivat viimeisen kerran, kunnes se palauttaa null signaalin siitä, että sivuja ei ole enää saatavilla.

Koska tämä funktio ei ole osa Power Queryn vakiokirjastoa, sinun on kopioitava sen lähdekoodi .pq-tiedostoon.

Funktion GetAllPagesByNextLink leipäteksti toteuttaa funktioargumentin getNextPage toiminnolle Table.GenerateByPage. Se kutsuu funktiota GetPage ja noutaa seuraavan tietosivun NextLink URL-osoitteen tietueen meta kentästä edellisestä kutsusta.

// Read all pages of data.
// After every page, we check the "NextLink" record on the metadata of the previous request.
// Table.GenerateByPage will keep asking for more pages until we return null.
GetAllPagesByNextLink = (url as text) as table =>
    Table.GenerateByPage((previous) => 
        let
            // if previous is null, then this is our first page of data
            nextLink = if (previous = null) then url else Value.Metadata(previous)[NextLink]?,
            // if NextLink was set to null by the previous call, we know we have no more data
            page = if (nextLink <> null) then GetPage(nextLink) else null
        in
            page
    );

GetPagen toteuttaminen

Funktio GetPage käyttää Web.Contents-funktiota tietojen yhden sivun noutamiseen TripPin-palvelusta ja vastauksen muuntamiseen taulukoksi. Se välittää vastauksen Web.Contents-kohteesta funktioon GetNextLink seuraavan sivun URL-osoitteen poimimiseksi ja asettaa sen meta palautetun taulukon (tietosivun) tietueelle.

Tämä toteutus on edellisten opetusohjelmien kutsun hieman muokattu versio TripPin.Feed .

GetPage = (url as text) as table =>
    let
        response = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),        
        body = Json.Document(response),
        nextLink = GetNextLink(body),
        data = Table.FromRecords(body[value])
    in
        data meta [NextLink = nextLink];

Funktion GetNextLink tarvitsee vain tarkistaa kentän vastauksen @odata.nextLink leipäteksti ja palauttaa sen arvon.

// In this implementation, 'response' will be the parsed body of the response after the call to Json.Document.
// Look for the '@odata.nextLink' field and simply return null if it doesn't exist.
GetNextLink = (response) as nullable text => Record.FieldOrDefault(response, "@odata.nextLink");

Kaikkien kokoaminen yhteen

Viimeinen vaihe sivutuslogiikan toteuttamisessa on päivittää TripPin.Feed käyttämään uusia funktioita. Sillä hetkellä kutsut vain GetAllPagesByNextLink:n kautta, mutta myöhemmissä opetusohjelmissa lisäät uusia ominaisuuksia (kuten rakenteen pakottaminen ja kyselyparametrilogiikka).

TripPin.Feed = (url as text) as table => GetAllPagesByNextLink(url);

Jos suoritat saman testikyselyn opetusohjelman aiemmasta versiosta, sinun pitäisi nyt nähdä sivun lukija toiminnassa. Sinun pitäisi myös nähdä, että vastauksessa on 24 riviä kahdeksan rivin sijaan.

QueryWithPaging.

Jos tarkastelet pyyntöjä fiddlerissä, sinun pitäisi nyt nähdä erilliset pyynnöt kullekin tietosivulle.

Fiddler.

Muistiinpano

Huomaat päällekkäisiä pyyntöjä palvelun ensimmäisellä tietosivulla, mikä ei ole ihanteellinen sivu. Lisäpyyntö on seurausta M-moduulin rakenteen tarkistamisesta. Ohita tämä ongelma nyt ja ratkaise se seuraavassa opetusohjelmassa, jossa käytät eksplisiittistä rakennetta.

Yhteenveto

Tämä osio näytti sinulle, miten voit ottaa käyttöön sivutustuen REST-ohjelmointirajapinnalle. Vaikka logiikka todennäköisesti vaihtelee ohjelmointirajapintojen välillä, tässä vahvistetun mallin tulisi olla uudelleenkäytettävä pienillä muutoksilla.

Seuraavalla oppitunnilla tutustut siihen, miten voit käyttää tiedoissa eksplisiittistä rakennetta, joka ulottuu kohteen sisältämien yksinkertaisten text ja number tietotyyppien Json.Documentulkopuolelle.

Seuraavat vaiheet

TripPin, osa 6 – rakenne