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).
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:
- Tuo yleinen
Table.GenerateByPage
funktio GetAllPagesByNextLink
Lisää funktio, jota käytetäänTable.GenerateByPage
kaikkien sivujen liimaamiseen yhteenGetPage
Lisää funktio, joka voi lukea yhden tietosivun- Lisää funktio, joka
GetNextLink
poimii seuraavan URL-osoitteen vastauksesta - 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.
GetAllPagesByNextLinkin toteuttaminen
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];
GetNextLink-linkin toteuttaminen
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.
Jos tarkastelet pyyntöjä fiddlerissä, sinun pitäisi nyt nähdä erilliset pyynnöt kullekin tietosivulle.
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.Document
ulkopuolelle.