Mønster for vent-forsøg igen
I nogle situationer svarer en datakildes funktionsmåde ikke til det, der forventes af Power Querys standardhåndtering af HTTP-kode. Nedenstående eksempler viser, hvordan du kan løse denne situation.
I dette scenarie arbejder du med en REST-API, der af og til returnerer en 500-statuskode, hvilket angiver en intern serverfejl. I disse tilfælde kan du vente et par sekunder og prøve igen, muligvis et par gange, før du giver op.
Hvis Web.Contents
får et svar på en statuskode på 500, udløses der som standard en DataSource.Error
. Du kan tilsidesætte denne funktionsmåde ved at angive en liste over koder som et valgfrit argument til Web.Contents
:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
Ved at angive statuskoderne på denne måde vil Power Query fortsætte med at behandle websvaret som normalt. Normal svarbehandling er dog ofte ikke passende i disse tilfælde. Du skal forstå, at der er modtaget en unormal svarkode, og at du skal udføre særlig logik for at håndtere den. Hvis du vil finde ud af, hvilken svarkode der blev returneret fra webtjenesten, kan du få adgang til den fra den meta
post, der ledsager svaret:
responseCode = Value.Metadata(response)[Response.Status]
Afhængigt af om responseCode
er 200 eller 500, kan du enten behandle resultatet som normalt eller følge logikken for dit vent-forsøg, som du vil konkretisere i næste afsnit.
Power Query har en lokal cache, der gemmer resultaterne af tidligere kald til Web.Contents. Når du forespørger den samme URL-adresse for et nyt svar, eller når du prøver igen efter en fejlstatus, skal du sikre dig, at forespørgslen ignorerer eventuelle cachelagrede resultater. Du kan gøre dette ved at inkludere indstillingen IsRetry
i kaldet til funktionen Web.Contents
. I dette eksempel angiver IsRetry
vi til true
efter den første gentagelse af løkken Value.WaitFor
.
Value.WaitFor()
er en standardhjælpefunktion, der normalt kan bruges uden ændringer. Det fungerer ved at oprette en liste over forsøg igen.
Dette indeholder den opgave, der (muligvis) skal prøves igen. Den repræsenteres som en funktion, så gentagelsesnummeret kan bruges i logikken producer
. Den forventede funktionsmåde er, at returneresnull
, producer
hvis et forsøg er bestemt til at være nødvendigt. Hvis andet end null
returneres af producer
, returneres denne værdi igen af Value.WaitFor
.
Dette indeholder den logik, der skal udføres mellem nye forsøg. Den repræsenteres som en funktion, så gentagelsesnummeret kan bruges i logikken delay
. Den forventede funktionsmåde er, at delay
returnerer en varighed.
Der kan angives et maksimalt antal forsøg ved at angive et tal til argumentet count
.
I følgende eksempel kan du se, hvordan ManualStatusHandling
og Value.WaitFor
kan bruges til at implementere et forsinket forsøg i tilfælde af et svar på 500. Ventetiden mellem nye forsøg fordobles ved hvert forsøg med maksimalt fem forsøg.
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