Læs på engelsk

Del via


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.

ManualStatusHandling

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.

IsRetry

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

Value.WaitFor()er en standardhjælpefunktion, der normalt kan bruges uden ændringer. Det fungerer ved at oprette en liste over forsøg igen.

producer Argument

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.

delay Argument

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.

count Argument (valgfrit)

Der kan angives et maksimalt antal forsøg ved at angive et tal til argumentet count .

Sætte det hele sammen

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