Auf Englisch lesen

Freigeben über


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.

ManualStatusHandling

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.

IsRetry

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

Value.WaitFor() ist eine Standard-Hilfsfunktion, die in der Regel ohne Änderungen verwendet werden kann. Es erstellt eine Liste mit Wiederholungsversuchen.

producer Argument

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

delay Argument

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.

count Argument (optional)

Sie können eine maximale Anzahl von Wiederholungen festlegen, indem Sie das Argument count mit einer Zahl versehen.

Zusammenfassung

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