Les på engelsk

Del via


Mønster for ventforsøk

I enkelte situasjoner samsvarer ikke en datakildes virkemåte som forventes av Power Querys standard HTTP-kodebehandling. Eksemplene nedenfor viser hvordan du kan omgå denne situasjonen.

I dette scenarioet skal du arbeide med en REST-API som av og til returnerer en 500-statuskode, som angir en intern serverfeil. I disse tilfellene kan du vente noen sekunder og prøve på nytt, potensielt et par ganger før du gir opp.

ManualStatusHandling

Hvis Web.Contents det får et svar på 500 statuskoder, blir det som standard angitt DataSource.Error . Du kan overstyre denne virkemåten ved å angi en liste over koder som et valgfritt argument til Web.Contents:

response = Web.Contents(url, [ManualStatusHandling={404, 500}])

Ved å angi statuskodene på denne måten fortsetter Power Query å behandle nettsvaret som normalt. Normal responsbehandling er imidlertid ofte ikke passende i disse tilfellene. Du må forstå at en unormal svarkode er mottatt og utfører spesiell logikk for å håndtere den. Hvis du vil finne svarkoden som ble returnert fra nettjenesten, kan du få tilgang til den fra posten meta som følger med svaret:

responseCode = Value.Metadata(response)[Response.Status]

Basert på om responseCode det er 200 eller 500, kan du enten behandle resultatet som normalt, eller følge venteforsøkslogikken som du vil kjøde ut i neste del.

IsRetry

Power Query har en lokal hurtigbuffer som lagrer resultatene fra tidligere kall til Web.Contents. Når du avspørrer den samme URL-adressen for et nytt svar, eller når du prøver på nytt etter en feilstatus, må du sørge for at spørringen ignorerer eventuelle bufrede resultater. Du kan gjøre dette ved å inkludere IsRetry alternativet i kallet til Web.Contents funksjonen. I dette eksemplet er vi satt IsRetry til true etter den første gjentakelsen Value.WaitFor av løkken.

Value.WaitFor

Value.WaitFor() er en standard hjelpefunksjon som vanligvis kan brukes uten endringer. Det fungerer ved å bygge en liste over forsøk på nytt.

producer Argumentet

Dette inneholder oppgaven som skal prøves på nytt. Den representeres som en funksjon, slik at gjentakelsesnummeret kan brukes i logikken producer . Den forventede virkemåten kommer producer tilbake null hvis et nytt forsøk er fastslått å være nødvendig. Hvis noe annet enn null det som returneres av producer, returneres denne verdien i sin tur av Value.WaitFor.

delay Argumentet

Dette inneholder logikken som skal utføres mellom nye forsøk. Den representeres som en funksjon, slik at gjentakelsesnummeret kan brukes i logikken delay . Den forventede virkemåten er som delay returnerer en varighet.

count Argument (valgfritt)

Maksimalt antall nye forsøk kan angis ved å angi et tall til count argumentet.

Sette alt sammen

Følgende eksempel viser hvordan ManualStatusHandling og Value.WaitFor kan brukes til å implementere et forsinket forsøk i tilfelle et svar på 500. Ventetiden mellom nye forsøk dobles med hvert forsøk, med maksimalt fem nye forsøk.

let
    waitForResult = Value.WaitFor(
        (iteration) =>
            let
                result = Web.Contents(url, [ManualStatusHandling = {500}, IsRetry = iteration > 0]),
                status = Value.Metadata(result)[Response.Status],
                actualResult = if status = 500 then null else result
            in
                actualResult,
        (iteration) => #duration(0, 0, 0, Number.Power(2, iteration)),
        5)
in
    if waitForResult = null then
        error "Value.WaitFor() Failed after multiple retry attempts"
    else
        waitForResult