Vzor Čakať – skúsiť znova
V niektorých situáciách sa správanie zdroja údajov nezhoduje so správaním očakávaným v predvolenom spracovaní kódu HTTP doplnku Power Query. Nižšie uvedené príklady ukazujú, ako túto situáciu vyriešiť.
V tomto scenári budete pracovať s rozhraním REST API, ktoré príležitostne vráti kód stavu 500, ktorý označuje internú chybu servera. V týchto prípadoch môžete počkať niekoľko sekúnd a opakovať to, potenciálne niekoľkokrát, kým sa vzdate.
Ak Web.Contents
sa zobrazí odpoveď kódu stavu 500, predvolene DataSource.Error
sa zobrazí. Toto správanie môžete prepísať zadaním zoznamu kódov ako voliteľného argumentu pre Web.Contents
:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
Zadaním kódov stavu týmto spôsobom bude Power Query naďalej spracovávať webovú odpoveď ako zvyčajne. V týchto prípadoch však normálne spracovanie odpovede nie je často vhodné. Budete musieť pochopiť, že bol prijatý kód abnormálne odpovede a vykonávať špeciálnu logiku na jeho spracovanie. Ak chcete určiť kód odpovede vrátený z webovej služby, môžete k nemu získať prístup zo záznamu meta
, ktorý sprevádza odpoveď:
responseCode = Value.Metadata(response)[Response.Status]
Na základe toho, či responseCode
je hodnota 200 alebo 500, môžete buď spracovať výsledok ako zvyčajne, alebo postupovať podľa logiky čakania, ktorú zistíte v ďalšej časti.
Power Query má lokálnu vyrovnávaciu pamäť, ktorá ukladá výsledky predchádzajúcich volaní do webového.obsahu. Pri vzorkovaní rovnakej URL adresy pre novú odpoveď alebo pri opätovnom pokuse o stav chyby je potrebné zabezpečiť, aby dotaz ignoroval všetky výsledky vo vyrovnávacej pamäti. Môžete to urobiť zahrnutím IsRetry
možnosti do Web.Contents
volania funkcie . V tejto ukážke nastavíme hodnotu IsRetry
true
po prvej iterácii Value.WaitFor
slučky.
Value.WaitFor()
je štandardná pomocná funkcia , ktorú možno zvyčajne použiť bez úpravy. Funguje tak, že vytvára zoznam pokusov opakovania.
Toto obsahuje úlohu, ktorá sa má (možno) zopakovať. Je zastúpená ako funkcia, aby sa iteračné číslo mohlo použiť v logike producer
. Očakávané správanie je to, ktoré sa vrátinull
, ak sa zistí, že producer
je potrebné skúsiť znova. Ak funkcia vráti niečo iné ako null
hodnotu producer
, táto hodnota sa vráti parametrom Value.WaitFor
.
Toto obsahuje logiku, ktorá sa má vykonať medzi pokusmi. Je zastúpená ako funkcia, aby sa iteračné číslo mohlo použiť v logike delay
. Očakávané správanie je, že delay
vracia trvanie.
Maximálny počet pokusov je možné nastaviť zadaním čísla do argumentu count
.
V nasledujúcom príklade je uvedené, ako ManualStatusHandling
a Value.WaitFor
možno použiť na uskutočnenie oneskoreného opakovania v prípade odozvy 500. Čas čakania medzi pokusmi sa zdvojnásobí pri každom pokuse, maximálne päť pokusov.
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