TripPin bölüm 5 - Sayfalama
Bu çok bölümlü öğretici, Power Query için yeni bir veri kaynağı uzantısı oluşturmayı kapsar. Öğreticinin sırayla yapılması amaçlanır; her ders önceki derslerde oluşturulan bağlayıcı üzerinde oluşturulur ve bağlayıcınıza artımlı olarak yeni özellikler ekler.
Bu derste şunları yapacaksınız:
- Bağlayıcıya disk belleği desteği ekleme
Birçok Rest API", "pages" içinde veri döndürerek istemcilerin sonuçları birleştirmesi için birden çok istekte bulunmalarını gerektirmektedir. Sayfalandırma için bazı yaygın kurallar (RFC 5988 gibi) olsa da, genellikle API'den API'ye değişir. Neyse ki TripPin bir OData hizmetidir ve OData standardı yanıtın gövdesinde döndürülen odata.nextLink değerlerini kullanarak sayfalandırma yapmanın bir yolunu tanımlar.
Bağlayıcının önceki yinelemelerini basitleştirmek için işlev sayfa farkında değildi.TripPin.Feed
yalnızca istekten döndürülen JSON'ı ayrıştırdı ve tablo olarak biçimlendirdi. OData protokolüne aşina olanlar, yanıtın biçimi üzerinde birçok yanlış varsayım yapıldığını fark etmiş olabilir (örneğin, bir kayıt dizisi içeren bir value
alan olduğunu varsayarsak).
Bu derste, yanıt işleme mantığınızı sayfaya duyarlı hale getirerek geliştirebilirsiniz. Gelecekteki öğreticiler, sayfa işleme mantığını daha sağlam hale getirir ve birden çok yanıt biçimini (hizmet hataları dahil) işleyebilir.
Not
OData.Feed'i temel alan bağlayıcılarla kendi disk belleği mantığınızı uygulamanız gerekmez, bu nedenle her şeyi sizin yerinize otomatik olarak işler.
Sayfalama denetim listesi
Disk belleği desteği uygularken API'niz hakkında aşağıdaki bilgileri bilmeniz gerekir:
- Sonraki veri sayfasını nasıl isteyebilirsiniz?
- Disk belleği mekanizması değerleri hesaplamayı mı içeriyor yoksa yanıttan sonraki sayfanın URL'sini ayıklıyor musunuz?
- Disk belleğini ne zaman durduracağını nasıl biliyorsun?
- Disk belleğiyle ilgili bilmeniz gereken parametreler var mı? ("sayfa boyutu" gibi)
Bu soruların yanıtı, disk belleği mantığınızı uygulama yönteminizi etkiler. Disk belleği uygulamalarında (Table.GenerateByPage kullanımı gibi) bir miktar kod yeniden kullanılmasına karşın bağlayıcıların çoğu özel mantık gerektirecektir.
Not
Bu ders, belirli bir biçimi izleyen bir OData hizmeti için disk belleği mantığı içerir. Disk belleği biçimini desteklemek için bağlayıcınızda yapmanız gereken değişiklikleri belirlemek için API'nizin belgelerine bakın.
OData Sayfalama'ya genel bakış
OData disk belleği, yanıt yükünde yer alan nextLink ek açıklamaları tarafından yönlendirilir. nextLink değeri, sonraki veri sayfasının URL'sini içerir. Yanıtta en dıştaki nesnede bir alan arayarak başka bir odata.nextLink
veri sayfası olup olmadığını bilirsiniz. Alan yoksa odata.nextLink
tüm verilerinizi okudunuz.
{
"odata.context": "...",
"odata.count": 37,
"value": [
{ },
{ },
{ }
],
"odata.nextLink": "...?$skiptoken=342r89"
}
Bazı OData hizmetleri istemcilerin maksimum sayfa boyutu tercihi sağlamasına izin verir, ancak bu tercihi kabul edip etmemek hizmete bağlıdır. Power Query'nin herhangi bir boyuttaki yanıtları işleyebilmesi gerekir, bu nedenle sayfa boyutu tercihi belirtme konusunda endişelenmeniz gerekmez; hizmetin size ne yapması gerekiyorsa destekleyebilirsiniz.
Sunucu Temelli Sayfalama hakkında daha fazla bilgi OData belirtiminde bulunabilir.
TripPin'i test etme
Disk belleği uygulamanızı düzeltmeden önce, önceki öğreticideki uzantının geçerli davranışını onaylayın. Aşağıdaki test sorgusu Kişiler tablosunu alır ve geçerli satır sayınızı göstermek için bir dizin sütunu ekler.
let
source = TripPin.Contents(),
data = source{[Name="People"]}[Data],
withRowCount = Table.AddIndexColumn(data, "Index")
in
withRowCount
Fiddler'ı açın ve sorguyu Power Query SDK'sında çalıştırın. Sorgunun sekiz satırlı bir tablo (dizin 0 - 7) döndürdüğünü unutmayın.
Fiddler'dan gelen yanıtın gövdesine bakarsanız, aslında kullanılabilir daha fazla veri sayfası olduğunu belirten bir @odata.nextLink
alan içerdiğini görürsünüz.
{
"@odata.context": "https://services.odata.org/V4/TripPinService/$metadata#People",
"@odata.nextLink": "https://services.odata.org/v4/TripPinService/People?%24skiptoken=8",
"value": [
{ },
{ },
{ }
]
}
TripPin için disk belleği uygulama
Şimdi uzantınızda aşağıdaki değişiklikleri yapacaksınız:
- Ortak
Table.GenerateByPage
işlevi içeri aktarma - Tüm sayfaları birbirine yapıştırmak için kullanan
Table.GenerateByPage
birGetAllPagesByNextLink
işlev ekleme - Tek bir
GetPage
veri sayfasını okuyabilen bir işlev ekleme - Yanıttan sonraki URL'yi ayıklamak için işlev
GetNextLink
ekleme - Yeni sayfa okuyucu işlevlerini kullanmak için güncelleştirin
TripPin.Feed
Not
Bu öğreticide daha önce belirtildiği gibi, disk belleği mantığı veri kaynakları arasında farklılık gösterir. Buradaki uygulama, mantığı yanıtta döndürülen sonraki bağlantıları kullanan kaynaklar için yeniden kullanılabilir olması gereken işlevlere ayırmaya çalışır.
Table.GenerateByPage
Kaynak tarafından döndürülen birden çok sayfayı (potansiyel olarak) tek bir tabloda birleştirmek için kullanacağız Table.GenerateByPage
. Bu işlev bağımsız değişkeni olarak adının önerdiğini yapması gereken bir getNextPage
işlev alır: sonraki veri sayfasını getirme. Table.GenerateByPage
işlevi tekrar tekrar çağırır; her geçirildiğinde, son çağrılışında oluşturulan sonuçlar, artık kullanılabilir sayfa kalmadığının null
sinyalini verene kadar tekrar tekrar çağırırgetNextPage
.
Bu işlev Power Query'nin standart kitaplığının bir parçası olmadığından kaynak kodunu .pq dosyanıza kopyalamanız gerekir.
GetAllPagesByNextLink Uygulama
İşlevinizin GetAllPagesByNextLink
gövdesi için Table.GenerateByPage
işlev bağımsız değişkenini getNextPage
uygular. İşlevi GetPage
çağırır ve önceki çağrıdan NextLink
kaydın alanından meta
sonraki veri sayfasının URL'sini alır.
// 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
);
GetPage Uygulama
İşlevinizGetPage
, TripPin hizmetinden tek bir veri sayfası almak ve yanıtı tabloya dönüştürmek için Web.Contents kullanır. Web.Contents yanıtını GetNextLink
işleve geçirerek sonraki sayfanın URL'sini ayıklar ve döndürülen tablonun (veri sayfası) kaydına meta
ayarlar.
Bu uygulama, önceki öğreticilerden gelen çağrının TripPin.Feed
biraz değiştirilmiş bir sürümüdür.
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 Uygulama
İşleviniz GetNextLink
yalnızca yanıtın gövdesini bir @odata.nextLink
alan için denetler ve değerini döndürür.
// 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");
Hepsini bir araya getirme
Disk belleği mantığınızı uygulamanın son adımı, yeni işlevleri kullanacak şekilde güncelleştirmektir TripPin.Feed
. Şimdilik yalnızca aracılığıyla GetAllPagesByNextLink
çağrısı yapacaksınız, ancak sonraki öğreticilerde yeni özellikler (şema zorlama ve sorgu parametresi mantığı gibi) ekleyeceksiniz.
TripPin.Feed = (url as text) as table => GetAllPagesByNextLink(url);
Öğreticinin önceki bölümlerinden aynı test sorgusunu yeniden çalıştırırsanız, artık sayfa okuyucunun çalıştığını görmeniz gerekir. Ayrıca yanıtta sekiz yerine 24 satırınız olduğunu da görmeniz gerekir.
Fiddler'daki isteklere bakarsanız artık her veri sayfası için ayrı istekler görmeniz gerekir.
Not
Hizmetten alınan verilerin ilk sayfası için yinelenen istekler olduğunu fark edeceksiniz. Bu, ideal değildir. Ek istek, M altyapısının şema denetimi davranışının bir sonucudur. Bu sorunu şimdilik yoksayın ve açık bir şema uygulayacağınız sonraki öğreticide çözebilirsiniz.
Sonuç
Bu ders, rest API için sayfalandırma desteğinin nasıl uygulanabildiğini gösterdi. Mantık büyük olasılıkla API'ler arasında farklılık gösterse de, burada oluşturulan desen küçük değişikliklerle yeniden kullanılabilir olmalıdır.
Sonraki derste, verilerinize açık bir şemanın nasıl uygulanacağını, basit ve number
veri türlerinin text
ötesine geçmeyi öğreneceksinizJson.Document
.