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

  1. 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).
  2. 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.
  3. 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.
  4. Ciklus megvalósítása: Hozzon létre egy ciklust, amely az állapot ellenőrzését végzi a megadott intervallummal.
  5. 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.
  6. 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.