Sobes.tech
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:

  1. 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).
  2. 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.
  3. Setarea parametrilor de așteptare: Definește timpul maxim de așteptare (timeout) și intervalul între verificări.
  4. Implementarea ciclului: Creează un ciclu care va efectua verificarea stării la intervale stabilite.
  5. 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.
  6. 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.