Middle
Jak zaimplementować wzorzec oczekiwania (Waiter) dla API?
sobes.tech AI
Odpowiedź od AI
Implementacja wzorca Waiter dla API polega na cyklicznym sprawdzaniu stanu zasobu lub wykonania operacji do momentu osiągnięcia oczekiwanego warunku lub wygaśnięcia ustawionego limitu czasu.
Główne kroki:
- Zdefiniuj warunek do sprawdzenia: Jasno określ, jaki stan API lub zasobu jest uważany za "gotowy" (np. zmiana statusu żądania, pojawienie się nowego wpisu, zwrócenie oczekiwanych danych).
- Wybierz mechanizm sprawdzania: Określ, jak będzie wykonywane sprawdzanie stanu. Może to być wielokrotne żądanie do tego samego punktu końcowego, żądanie do specjalnego punktu statusu lub sprawdzanie zawartości odpowiedzi.
- Ustaw parametry oczekiwania: Zdefiniuj maksymalny czas oczekiwania (timeout) i interwał między sprawdzeniami.
- Implementuj pętlę: Utwórz pętlę, która będzie wykonywać sprawdzanie stanu w określonych odstępach czasu.
- Obsługa warunków wyjścia:
- Wyjście po osiągnięciu oczekiwanego warunku.
- Wyjście po upływie limitu czasu, z rzuceniem wyjątku lub błędu.
- Obsługa błędów podczas sprawdzania: Zapewnij obsługę możliwych błędów podczas wykonywania sprawdzenia w pętli (np. tymczasowa niedostępność API).
Przykład pseudokodu:
# 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) # Wykonaj żądanie do API
if check_condition(response, expected_condition): # Sprawdź warunek gotowości
return True # Warunek spełniony
sleep(interval_seconds) # Odczekaj przed kolejnym sprawdzeniem
current_time = current_time # Zaktualizuj czas
raise TimeoutError("Zasób nie jest gotowy w wyznaczonym czasie") # Limit czasu przekroczony
# check_condition(response, expected_condition):
# Logika sprawdzania warunku gotowości na podstawie odpowiedzi API
# Na przykład, return response['status'] == 'ready'
Przykład w Pythonie z użyciem biblioteki requests:
import requests
import time
def wait_for_status(url, expected_status, timeout=60, interval=5):
"""
Czeka, aż endpoint zwróci określony status.
"""
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')}] Otrzymano status {expected_status}.")
return True
except requests.exceptions.RequestException as e:
print(f"[{time.strftime('%H:%M:%S')}] Błąd żądania: {e}. Powtórka za {interval} sekund.")
time.sleep(interval)
raise TimeoutError(f"Nie udało się uzyskać statusu {expected_status} w ciągu {timeout} sekund.")
# Przykład użycia
# try:
# wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
# print(e)
Wybór konkretnej implementacji zależy od specyfiki API i wymagań testowych. Ważne jest zapewnienie elastyczności w ustawianiu limitów czasowych i interwałów, a także informacyjnych komunikatów o przekroczeniu limitu czasu.