Model opakování čekání
V některých situacích chování zdroje dat neodpovídá výchozímu zpracování kódu HTTP v Power Query. Následující příklady ukazují, jak tuto situaci obejít.
V tomto scénáři budete pracovat s rozhraním REST API, které občas vrátí stavový kód 500 označující vnitřní chybu serveru. V těchto případech můžete několik sekund počkat a zkusit to znovu, potenciálně několikrát, než se vzdáte.
Pokud Web.Contents
se zobrazí odpověď stavového kódu 500, vyvolá DataSource.Error
ve výchozím nastavení chybu. Toto chování můžete přepsat tak, že jako volitelný argument Web.Contents
poskytnete seznam kódů:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
Když tímto způsobem zadáte stavové kódy, Bude Power Query dál zpracovávat webovou odpověď jako obvykle. V těchto případech ale běžné zpracování odpovědí není často vhodné. Budete muset pochopit, že byl přijat neobvyklý kód odpovědi, a provést speciální logiku pro jeho zpracování. Pokud chcete zjistit kód odpovědi vrácený z webové služby, můžete k němu přistupovat z záznamu meta
, který doprovází odpověď:
responseCode = Value.Metadata(response)[Response.Status]
Na základě toho, jestli responseCode
je 200 nebo 500, můžete výsledek zpracovat jako normální, nebo postupovat podle logiky čekání a opakování, kterou vytvoříte v další části.
Power Query obsahuje místní mezipaměť, která ukládá výsledky předchozích volání web.Contents. Při dotazování stejné adresy URL na novou odpověď nebo při opakování po chybovém stavu budete muset zajistit, aby dotaz ignoroval všechny výsledky uložené v mezipaměti. Můžete to udělat tak, IsRetry
že do volání Web.Contents
funkce zahrnete možnost. V této ukázce nastavíme IsRetry
po true
první iteraci smyčky Value.WaitFor
.
Value.WaitFor()
je standardní pomocná funkce , kterou lze obvykle použít bez úprav. Funguje tak, že sestaví seznam opakovaných pokusů.
Obsahuje úkol, který se má (pravděpodobně) opakovat. Je reprezentovaná jako funkce, aby bylo možné v logice producer
použít číslo iterace. Očekávané chování je, že se vrátínull
, producer
pokud je zjištěno, že je nutné opakovat. Pokud je vráceno cokoli jiného, než null
je vráceno producer
, tato hodnota je vrácena Value.WaitFor
.
Obsahuje logiku, která se má provést mezi opakovanými pokusy. Je reprezentovaná jako funkce, aby bylo možné v logice delay
použít číslo iterace. Očekávané chování je, že delay
vrací dobu trvání.
Maximální počet opakování lze nastavit zadáním čísla argumentu count
.
Následující příklad ukazuje, jak ManualStatusHandling
a Value.WaitFor
lze použít k implementaci zpožděného opakování v případě odpovědi 500. Doba čekání mezi opakovanými pokusy se s každým pokusem zdvojnásobí, maximálně pět opakování.
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