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.
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.
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()
er en standard hjelpefunksjon som vanligvis kan brukes uten endringer. Det fungerer ved å bygge en liste over forsøk på nytt.
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
.
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.
Maksimalt antall nye forsøk kan angis ved å angi et tall til count
argumentet.
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