Middle
Cum se implementează pattern-ul de așteptare (Waiter) pentru API?
sobes.tech AI
Răspuns de la AI
Implementarea pattern-ului Waiter pentru API constă în verificarea ciclică a stării resursei sau executarea unei operații până când condiția așteptată este îndeplinită sau expiră timeout-ul setat.
Pașii principali:
- Definirea condiției de verificat: Înțelege clar ce stare a API-ului sau resursei este considerată "gata" (de exemplu, starea cererii s-a schimbat, a apărut o înregistrare nouă, au fost returnate datele așteptate).
- Alegerea mecanismului de verificare: Determină modul în care va fi efectuată verificarea stării. Poate fi o solicitare repetată către același endpoint, o solicitare către un endpoint de stare special sau verificarea conținutului răspunsului.
- Setarea parametrilor de așteptare: Definește timpul maxim de așteptare (timeout) și intervalul între verificări.
- Implementarea ciclului: Creează un ciclu care va efectua verificarea stării la intervale stabilite.
- Gestionarea condițiilor de ieșire:
- Ieșire la atingerea condiției așteptate.
- Ieșire la expirarea timeout-ului, însoțită de o excepție sau eroare.
- Gestionarea erorilor în timpul verificării: Prevede gestionarea eventualelor erori în timpul execuției verificării în interiorul ciclului (de exemplu, API-ul poate fi temporar indisponibil).
Exemplu de pseudocod:
# 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) # Efectuează solicitarea către API
if check_condition(response, expected_condition): # Verifică condiția de disponibilitate
return True # Condiția a fost îndeplinită
sleep(interval_seconds) # Așteaptă înainte de următoarea verificare
current_time = current_time # Actualizează timpul curent
raise TimeoutError("Resursa nu este gata în timpul alocat") # Timeout
# check_condition(response, expected_condition):
# Logica verificării condiției de disponibilitate bazată pe răspunsul API
# De exemplu, return response['status'] == 'ready'
Exemplu în Python cu biblioteca requests:
import requests
import time
def wait_for_status(url, expected_status, timeout=60, interval=5):
"""
Așteaptă ca endpoint-ul să returneze un anumit 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')}] Status {expected_status} primit.")
return True
except requests.exceptions.RequestException as e:
print(f"[{time.strftime('%H:%M:%S')}] Eroare de solicitare: {e}. Repetă în {interval} secunde.")
time.sleep(interval)
raise TimeoutError(f"Nu s-a putut obține statusul {expected_status} în {timeout} secunde.")
# Exemplu de utilizare
# try:
# wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
# print(e)
Alegerea implementării specifice depinde de particularitățile API-ului și de cerințele de testare. Este important să asiguri flexibilitate în configurarea timeout-urilor și intervalelor, precum și mesaje informative despre expirarea timeout-ului.