Wait-Retry-Muster
In manchen Situationen stimmt das Verhalten einer Datenquelle nicht mit dem überein, was die Standard-HTTP-Codebehandlung von Power Query erwartet. Die folgenden Beispiele zeigen, wie Sie diese Situation umgehen können.
In diesem Szenario arbeiten Sie mit einer REST-API, die gelegentlich einen Statuscode 500 zurückgibt, der auf einen internen Serverfehler hinweist. In diesen Fällen können Sie ein paar Sekunden warten und es erneut versuchen, möglicherweise einige Male, bevor Sie aufgeben.
Wenn Web.Contents
eine Antwort mit dem Statuscode 500 erhält, wird standardmäßig DataSource.Error
zurückgegeben. Sie können dieses Verhalten außer Kraft setzen, indem Sie eine Liste von Codes als optionales Argument an Web.Contents
übergeben:
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
Wenn Sie die Statuscodes auf diese Weise angeben, verarbeitet Power Query die Web-Antwort wie gewohnt weiter. Die normale Antwortverarbeitung ist in diesen Fällen jedoch oft nicht angemessen. Sie müssen verstehen, dass ein abnormaler Antwortcode empfangen wurde und eine spezielle Logik ausführen, um ihn zu behandeln. Um den Antwortcode zu ermitteln, der vom Webdienst zurückgegeben wurde, können Sie ihn aus „meta
-Aufzeichnung“ abrufen, der die Antwort begleitet:
responseCode = Value.Metadata(response)[Response.Status]
Je nachdem, ob responseCode
200 oder 500 ist, können Sie das Ergebnis entweder ganz normal verarbeiten oder Ihrer Logik des Wartens und Wiederholens folgen, die Sie im nächsten Abschnitt näher erläutern werden.
Power Query verfügt über einen lokalen Cache, in dem die Ergebnisse früherer Aufrufe von Web.Contents gespeichert werden. Wenn Sie dieselbe URL für eine neue Antwort abfragen oder wenn Sie es nach einem Fehlerstatus erneut versuchen, müssen Sie sicherstellen, dass die Abfrage alle zwischengespeicherten Ergebnisse ignoriert. Sie können dies tun, indem Sie die Option IsRetry
in den Aufruf der Funktion Web.Contents
aufnehmen. In diesem Beispiel setzen wir IsRetry
nach der ersten Iteration der Value.WaitFor
-Schleife auf true
.
Value.WaitFor()
ist eine Standard-Hilfsfunktion, die in der Regel ohne Änderungen verwendet werden kann. Es erstellt eine Liste mit Wiederholungsversuchen.
Dies enthält die Aufgabe, die (möglicherweise) erneut versucht werden soll. Sie wird als Funktion dargestellt, damit die Iterationsnummer in der Logik von producer
verwendet werden kann. Das erwartete Verhalten ist, dass producer
null
zurückgibt, wenn ein erneuter Versuch für notwendig erachtet wird. Wird von producer
etwas anderes als null
zurückgegeben, wird dieser Wert wiederum von Value.WaitFor
zurückgegeben.
Dies enthält die Logik, die zwischen den Wiederholungsversuchen ausgeführt werden soll. Sie wird als Funktion dargestellt, damit die Iterationsnummer in der Logik von delay
verwendet werden kann. Das erwartete Verhalten ist, dass delay
eine Dauer zurückgibt.
Sie können eine maximale Anzahl von Wiederholungen festlegen, indem Sie das Argument count
mit einer Zahl versehen.
Das folgende Beispiel zeigt, wie ManualStatusHandling
und Value.WaitFor
verwendet werden können, um eine verzögerte Wiederholung im Falle einer 500er-Antwort zu implementieren. Die Wartezeit zwischen den Wiederholungsversuchen verdoppelt sich mit jedem Versuch, wobei maximal fünf Wiederholungsversuche möglich sind.
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