Číst v angličtině

Sdílet prostřednictvím


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.

ManualStatusHandling

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.Contentsposkytnete 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.

IsRetry

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

Value.WaitFor() je standardní pomocná funkce , kterou lze obvykle použít bez úprav. Funguje tak, že sestaví seznam opakovaných pokusů.

producer Argument

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.

delay Argument

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í.

count Argument (volitelné)

Maximální počet opakování lze nastavit zadáním čísla argumentu count .

Seskupování všech

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