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:
- 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).
- 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.
- Festlegung der Warteparameter: Maximale Wartezeit (Timeout) und Intervall zwischen den Überprüfungen.
- Implementierung der Schleife: Erstellung einer Schleife, die den Status in festgelegten Intervallen überprüft.
- Behandlung der Abbruchbedingungen:
- Beenden bei Erreichen der erwarteten Bedingung.
- Beenden bei Ablauf des Timeouts, begleitet von einer Ausnahme oder einem Fehler.
- 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.