Aracılığıyla paylaş


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.

QueryWithoutPaging.

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:

  1. Ortak Table.GenerateByPage işlevi içeri aktarma
  2. Tüm sayfaları birbirine yapıştırmak için kullanan Table.GenerateByPage bir GetAllPagesByNextLink işlev ekleme
  3. Tek bir GetPage veri sayfasını okuyabilen bir işlev ekleme
  4. Yanıttan sonraki URL'yi ayıklamak için işlev GetNextLink ekleme
  5. 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.GenerateByPageiş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.

İşlevinizin GetAllPagesByNextLink gövdesi için Table.GenerateByPageiş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];

İş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.

QueryWithPaging.

Fiddler'daki isteklere bakarsanız artık her veri sayfası için ayrı istekler görmeniz gerekir.

Fiddler.

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.

Sonraki adımlar

TripPin Bölüm 6 - Şema