Middle
Hogyan valósítható meg a várakozó (Waiter) minta API-khoz?
sobes.tech MI
Válasz az MI-től
A Waiter mintázat API-hoz való megvalósítása a forrás vagy művelet állapotának ciklikus ellenőrzését jelenti, amíg a várt feltétel el nem érkezik vagy a megadott időkorlát le nem jár.
Fő lépések:
- Az ellenőrzött feltétel meghatározása: Világosan határozza meg, mely API vagy erőforrás állapot számít "késznek" (pl. a kérés státusza megváltozott, új rekord jelent meg, a várt adatok visszatértek).
- Ellenőrzési mechanizmus kiválasztása: Határozza meg, hogyan fog történni az állapot ellenőrzése. Ez lehet ismételt kérés ugyanarra a végpontra, külön státusz végpont kérés vagy a válasz tartalmának ellenőrzése.
- Várakozási paraméterek beállítása: Állítsa be a maximális várakozási időt (timeout) és az ellenőrzések közötti intervallumot.
- Ciklus megvalósítása: Hozzon létre egy ciklust, amely az állapot ellenőrzését végzi a megadott intervallummal.
- Kilépési feltételek kezelése:
- Kilépés a várt feltétel elérésekor.
- Kilépés a timeout lejártakor, kivétellel vagy hibával.
- Hiba kezelés az ellenőrzés során: Számoljon az esetleges hibák kezelésével a cikluson belül (pl. API ideiglenes elérhetetlensége).
Példa pszeudokód:
# 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 kérés végrehajtása
if check_condition(response, expected_condition): # Kész állapot ellenőrzése
return True # Feltétel teljesült
sleep(interval_seconds) # Várakozás a következő ellenőrzés előtt
current_time = current_time # Aktuális idő frissítése
raise TimeoutError("A forrás nem volt kész a megadott időn belül") # Időkorlát lejárt
# check_condition(response, expected_condition):
# Az ellenőrzési logika az API válasza alapján
# Például, return response['status'] == 'ready'
Python példával requests könyvtár használatával:
import requests
import time
def wait_for_status(url, expected_status, timeout=60, interval=5):
"""
Várakozik, amíg az végpont egy adott státuszt nem ad vissza.
"""
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')}] A {expected_status} státusz megkapva.")
return True
except requests.exceptions.RequestException as e:
print(f"[{time.strftime('%H:%M:%S')}] Kérés hiba: {e}. Újrapróbálkozás {interval} másodperc múlva.")
time.sleep(interval)
raise TimeoutError(f"Nem sikerült a {expected_status} státusz elérése {timeout} másodpercen belül.")
# Használati példa
# try:
# wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
# print(e)
A konkrét megvalósítás kiválasztása az API sajátosságaitól és a tesztelési követelményektől függ. Fontos, hogy rugalmasan állítható legyen a timeout és az intervallum, valamint informatív üzenetek legyenek a timeout lejáratáról.