Läs på engelska

Dela via


Mönster för vänteförsök

I vissa situationer matchar inte en datakällas beteende det som förväntas av Power Querys standardhantering av HTTP-kod. Exemplen nedan visar hur du kan kringgå den här situationen.

I det här scenariot arbetar du med ett REST API som ibland returnerar en 500-statuskod, vilket indikerar ett internt serverfel. I dessa fall kan du vänta några sekunder och försöka igen, eventuellt några gånger innan du ger upp.

ManualStatusHandling

Om Web.Contents får ett 500-statuskodsvar genererar det ett DataSource.Error som standard. Du kan åsidosätta det här beteendet genom att ange en lista med koder som ett valfritt argument till Web.Contents:

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

Genom att ange statuskoderna på det här sättet fortsätter Power Query att bearbeta webbsvaret som vanligt. Normal svarsbearbetning är dock ofta inte lämplig i dessa fall. Du måste förstå att en onormal svarskod har tagits emot och utföra särskild logik för att hantera den. För att fastställa svarskoden som returnerades från webbtjänsten kan du komma åt den från posten meta som medföljer svaret:

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

Baserat på om responseCode är 200 eller 500 kan du antingen bearbeta resultatet som vanligt eller följa logiken för väntetidsförsök som du kommer att utveckla i nästa avsnitt.

IsRetry

Power Query har en lokal cache som lagrar resultatet från tidigare anrop till Web.Contents. När du avsöker samma URL för ett nytt svar, eller när du försöker igen efter en felstatus, måste du se till att frågan ignorerar cachelagrade resultat. Du kan göra detta genom att inkludera IsRetry alternativet i anropet till Web.Contents funktionen. I det här exemplet anger IsRetry vi till true efter den första iterationen av loopen Value.WaitFor .

Value.WaitFor

Value.WaitFor()är en standardhjälpfunktion som vanligtvis kan användas utan ändringar. Det fungerar genom att skapa en lista över återförsök.

producer Argument

Detta innehåller den uppgift som ska (eventuellt) försökas igen. Den representeras som en funktion så att iterationsnumret kan användas i logiken producer . Det förväntade beteendet är att det producer returneras null om ett nytt försök bedöms vara nödvändigt. Om något annat än null returneras av producerreturneras värdet i sin tur av Value.WaitFor.

delay Argument

Detta innehåller logiken som ska köras mellan återförsök. Den representeras som en funktion så att iterationsnumret kan användas i logiken delay . Det förväntade beteendet är att delay returnera en varaktighet.

count Argument (valfritt)

Ett maximalt antal återförsök kan anges genom att ange ett tal till count argumentet.

Sätta ihop allt

I följande exempel visas hur ManualStatusHandling och Value.WaitFor kan användas för att implementera ett fördröjt återförsök i händelse av ett 500-svar. Väntetiden mellan återförsöken fördubblas med varje försök, med högst fem återförsö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