Sobes.tech
Middle

Ako implementovať vzor čakania (Waiter) pre API?

sobes.tech AI

Odpoveď od AI

Implementácia vzoru Waiter pre API spočíva v cyklickej kontrole stavu zdroja alebo vykonaní operácie, kým nebude dosiahnutá očakávaná podmienka alebo nevyprší stanovený časový limit.

Hlavné kroky:

  1. Definovanie kontrolovanej podmienky: Jasne pochopiť, aký stav API alebo zdroja sa považuje za "hotový" (napríklad, zmena stavu požiadavky, vznik novej položky, vrátenie očakávaných dát).
  2. Výber mechanizmu kontroly: Určiť, ako bude kontrola stavu vykonávaná. Môže to byť opakovaný požiadavok na ten istý endpoint, požiadavka na špeciálny endpoint stavu alebo kontrola obsahu odpovede.
  3. Nastavenie parametrov čakania: Stanoviť maximálny čas čakania (timeout) a interval medzi kontrolami.
  4. Implementácia slučky: Vytvoriť slučku, ktorá bude vykonávať kontrolu stavu s daným intervalom.
  5. Spracovanie podmienok ukončenia:
    • Ukončenie pri dosiahnutí očakávanej podmienky.
    • Ukončenie pri vypršaní timeoutu, sprevádzané výnimkou alebo chybou.
  6. Spracovanie chýb pri kontrole: Predvídať spracovanie možných chýb počas vykonávania kontroly vo vnútri slučky (napríklad, dočasná nedostupnosť API).

Príklad pseudokódu:

# 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) # Vykonanie požiadavky na API

    if check_condition(response, expected_condition): # Kontrola podmienky pripravenosti
        return True # Podmienka je splnená

    sleep(interval_seconds) # Počkanie pred ďalšou kontrolou
    current_time = current_time # Aktualizovať aktuálny čas

raise TimeoutError("Zdroj nie je pripravený v stanovenom čase") # Vypršal časový limit

# check_condition(response, expected_condition):
# Logika kontroly podmienky pripravenosti na základe odpovede API
# Napríklad, return response['status'] == 'ready'

Príklad v Pythone s použitím knižnice requests:

import requests
import time

def wait_for_status(url, expected_status, timeout=60, interval=5):
    """
    Čaká, kým endpoint nevráti určitý stav.
    """
    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')}] Stav {expected_status} získaný.")
                return True
        except requests.exceptions.RequestException as e:
            print(f"[{time.strftime('%H:%M:%S')}] Chyba požiadavky: {e}. Opakovanie za {interval} sekúnd.")

        time.sleep(interval)

    raise TimeoutError(f"Nepodarilo sa získať stav {expected_status} za {timeout} sekúnd.")

# Príklad použitia
# try:
#     wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
#     print(e)

Výber konkrétnej implementácie závisí od špecifikácie API a požiadaviek na testovanie. Je dôležité zabezpečiť flexibilitu v nastavení timeoutov a intervalov, ako aj informatívne správy o vypršaní časového limitu.