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.
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.
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()
är en standardhjälpfunktion som vanligtvis kan användas utan ändringar. Det fungerar genom att skapa en lista över återförsök.
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 producer
returneras värdet i sin tur av Value.WaitFor
.
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.
Ett maximalt antal återförsök kan anges genom att ange ett tal till count
argumentet.
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