Sobes.tech
Middle

Wie implementiert man das Waiter-Muster für APIs?

sobes.tech KI

Antwort von AI

Die Implementierung des Waiter-Musters für APIs besteht darin, den Status der Ressource oder die Ausführung einer Operation zyklisch zu überprüfen, bis die erwartete Bedingung erfüllt ist oder der festgelegte Timeout erreicht wird.

Hauptschritte:

  1. Definition der zu überprüfenden Bedingung: Klare Festlegung, welcher Zustand der API oder Ressource als "bereit" gilt (z.B. Status der Anfrage hat sich geändert, ein neuer Eintrag ist erschienen, die erwarteten Daten wurden zurückgegeben).
  2. Auswahl des Überwachungsmechanismus: Festlegung, wie der Status überprüft wird. Dies kann eine wiederholte Anfrage an denselben Endpunkt, eine Anfrage an einen speziellen Status-Endpunkt oder die Überprüfung des Antwortinhalts sein.
  3. Festlegung der Warteparameter: Maximale Wartezeit (Timeout) und Intervall zwischen den Überprüfungen.
  4. Implementierung der Schleife: Erstellung einer Schleife, die den Status in festgelegten Intervallen überprüft.
  5. Behandlung der Abbruchbedingungen:
    • Beenden bei Erreichen der erwarteten Bedingung.
    • Beenden bei Ablauf des Timeouts, begleitet von einer Ausnahme oder einem Fehler.
  6. Fehlerbehandlung bei Überprüfungen: Fehler während der Überprüfung innerhalb der Schleife abfangen (z.B. API vorübergehend nicht erreichbar).

Beispiel für Pseudocode:

# wait_for_resource_ready(api_endpoint, expected_condition, timeout_seconds, interval_seconds)

start_time = current_time
while current_time - start_time < timeout_seconds:
    response = make_api_request(api_endpoint) # API-Anfrage

    if check_condition(response, expected_condition): # Überprüfung der Bereitschaftsbedingung
        return True # Bedingung erfüllt

    sleep(interval_seconds) # Warten vor der nächsten Überprüfung
    current_time = current_time # Aktualisierung der aktuellen Zeit

raise TimeoutError("Ressource nicht bereit innerhalb des Timeouts") # Timeout erreicht

# check_condition(response, expected_condition):
# Logik zur Überprüfung der Bereitschaftsbedingung basierend auf der API-Antwort
# Zum Beispiel, return response['status'] == 'ready'

Beispiel in Python mit der requests-Bibliothek:

import requests
import time

def wait_for_status(url, expected_status, timeout=60, interval=5):
    """
    Wartet, bis der Endpunkt einen bestimmten Status zurückgibt.
    """
    start_time = time.time()

    while time.time() - start_time < timeout:
        try:
            response = requests.get(url)
            if response.status_code == expected_status:
                print(f"[{time.strftime('%H:%M:%S')}] Status {expected_status} empfangen.")
                return True
        except requests.exceptions.RequestException as e:
            print(f"[{time.strftime('%H:%M:%S')}] Anfragefehler: {e}. Wiederholung in {interval} Sekunden.")

        time.sleep(interval)

    raise TimeoutError(f"Status {expected_status} konnte nicht innerhalb von {timeout} Sekunden abgerufen werden.")

# Beispiel für die Verwendung
# try:
#     wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
#     print(e)

Die konkrete Umsetzung hängt von der API und den Testanforderungen ab. Es ist wichtig, Flexibilität bei der Einstellung von Timeout-Werten und Intervallen sowie informative Nachrichten bei Timeout zu gewährleisten.