等候重試模式
在某些情況下,數據源的行為與 Power Query 的預設 HTTP 程式代碼處理所預期的行為不符。 下列範例示範如何解決這種情況。
在此案例中,您將使用偶爾會傳回 500 狀態代碼的 REST API,指出內部伺服器錯誤。 在這些情況下,您可以等候幾秒鐘並重試,可能先重試幾次,再放棄。
如果 Web.Contents
取得 500 狀態代碼回應,則預設會 DataSource.Error
擲回 。 您可以藉由提供程式碼清單做為 的選擇性自變數來 Web.Contents
覆寫此行為:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
藉由以這種方式指定狀態代碼,Power Query 會繼續正常處理 Web 回應。 不過,在這些情況下,一般回應處理通常不適用。 您必須瞭解已收到異常回應碼,並執行特殊邏輯來處理它。 若要判斷從 Web 服務傳回的回應碼,您可以從回應隨附的 meta
Record 存取它:
responseCode = Value.Metadata(response)[Response.Status]
根據 responseCode
200 或 500,您可以正常處理結果,或遵循您將在下一節中充實的等候重試邏輯。
Power Query 具有本機快取,可儲存先前對 Web.Contents 呼叫的結果。 輪詢新回應的相同 URL,或在錯誤狀態之後重試時,您必須確定查詢會忽略任何快取的結果。 您可以藉由在呼叫 函式時加入 IsRetry
選項來執行 Web.Contents
此動作。 在這裡範例中,我們會在迴圈的第一次反覆Value.WaitFor
項目之後設定IsRetry
為 true
。
Value.WaitFor()
是標準 協助程式函 式,通常不需修改即可使用。 其運作方式是建置重試嘗試清單。
這包括要重試的工作。 它會以函式表示,讓反覆專案編號可用於邏輯中 producer
。 預期的行為是 producer
,如果判斷需要重試,則會傳回 null
。 如果 以外的 null
任何專案由 producer
傳回 ,則該值會由 傳回 Value.WaitFor
。
這包括在重試之間執行的邏輯。 它會以函式表示,讓反覆專案編號可用於邏輯中 delay
。 預期的行為是 delay
傳回 Duration。
您可以藉由提供數位給 count
自變數,來設定重試次數上限。
下列範例示範如何在 ManualStatusHandling
500 回應時實作延遲重試,以及 Value.WaitFor
可用來實作延遲重試。 每次嘗試重試之間的等候時間會加倍,最多重試 5 次。
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