Uudelleenyritysten odotuksen malli
Joissakin tilanteissa tietolähteen toiminta ei vastaa Power Queryn OLETUSARVOisen HTTP-koodinkäsittelyn odotettua toimintaa. Seuraavissa esimerkeissä näytetään, miten voit kiertää tämän tilanteen.
Tässä skenaariossa käsittelet REST-ohjelmointirajapintaa, joka palauttaa ajoittain 500 tilakoodin, joka ilmaisee sisäistä palvelinvirhettä. Näissä tapauksissa voit odottaa muutaman sekunnin ja yrittää uudelleen, mahdollisesti muutaman kerran ennen kuin luovut.
Jos Web.Contents
se saa 500 tilakoodin vastauksen, se palauttaa oletusarvon DataSource.Error
mukaan. Voit ohittaa tämän toiminnan antamalla koodiluettelon valinnaisena argumenttina kohteeseen Web.Contents
:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
Kun määrität tilakoodit tällä tavalla, Power Query jatkaa verkkovastauksen käsittelemistä normaalisti. Näissä tapauksissa normaali vastekäsittely ei kuitenkaan useinkaan ole asianmukaista. Sinun täytyy ymmärtää, että epänormaali vastauskoodi on vastaanotettu, ja suorittaa erityistä logiikkaa sen käsittelemiseksi. Voit määrittää verkkopalvelusta palautetun vastauskoodin käyttämällä sitä vastauksen mukana tulevasta tietueesta meta
:
responseCode = Value.Metadata(response)[Response.Status]
Sen perusteella, onko responseCode
tulos 200 vai 500, voit joko käsitellä tuloksen normaalina tai seurata uudelleenodottavaa logiikkaa, jonka muotoilet seuraavassa osiossa.
Power Queryssä on paikallinen välimuisti, joka tallentaa web.contents-edellisten kutsujen tulokset. Kun teet kyselyn samalle URL-osoitteelle uutta vastausta varten tai yrität uudelleen virhetilan jälkeen, sinun on varmistettava, että kysely jättää huomiotta kaikki välimuistiin tallennetut tulokset. Voit tehdä tämän sisällyttämällä - IsRetry
asetuksen funktion kutsuun Web.Contents
. Tässä esimerkissä -silmukan ensimmäisen iteraation jälkeen asetetaan IsRetry
arvoksi Value.WaitFor
true
.
Value.WaitFor()
on vakioaputoiminto , jota voi yleensä käyttää ilman muutoksia. Se toimii luomalla uudelleenyritysten luettelon.
Tämä sisältää tehtävän, jota on (mahdollisesti) yritetään uudelleen. Se esitetään funktiona, jotta iterointinumeroa voidaan käyttää logiikassa producer
. Odotettu toimintatapa on, joka palautuunull
, producer
jos uudelleenyritysten todetaan olevan tarpeellisia. Jos jokin muu kuin null
-arvo palautetaan producer
, palauttaa tämän arvon puolestaan Value.WaitFor
.
Tämä sisältää logiikan, joka suoritetaan uudelleenlyöntien välillä. Se esitetään funktiona, jotta iterointinumeroa voidaan käyttää logiikassa delay
. Odotettu toiminta delay
palauttaa keston.
Uudelleententien enimmäismäärä voidaan määrittää antamalla argumentille count
luku.
Seuraavassa esimerkissä näytetään, miten ManualStatusHandling
ja Value.WaitFor
voidaan käyttää viivästyneen uudelleenyrityksen toteuttamiseen 500 vastauksen tapauksessa. Odotusaika uudelleenyritysten välillä kaksinkertaistuu jokaisen yrityksen kanssa, ja enintään viisi yritystä yritetään uudelleen.
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