Sobes.tech
Middle

Jak implementovat vzor čekání (Waiter) pro API?

sobes.tech AI

Odpověď od AI

Implementace vzoru Waiter pro API spočívá v cyklické kontrole stavu zdroje nebo provádění operace, dokud není dosaženo očekávané podmínky nebo nevyprší stanovený časový limit.

Hlavní kroky:

  1. Definice kontrolované podmínky: Jasně pochopit, jaký stav API nebo zdroje je považován za "připravený" (například změna stavu požadavku, vznik nové položky, vrácení očekávaných dat).
  2. Volba mechanismu kontroly: Určit, jak bude kontrola stavu prováděna. Může to být opakovaný požadavek na stejný endpoint, požadavek na speciální endpoint stavu nebo kontrola obsahu odpovědi.
  3. Nastavení parametrů čekání: Stanovit maximální dobu čekání (timeout) a interval mezi kontrolami.
  4. Implementace cyklu: Vytvořit cyklus, který bude provádět kontrolu stavu s daným intervalem.
  5. Zpracování podmínek ukončení:
    • Ukončení při dosažení očekávané podmínky.
    • Ukončení při vypršení časového limitu, doprovázené výjimkou nebo chybou.
  6. Zpracování chyb při kontrole: Předvídat zpracování možných chyb během provádění kontroly uvnitř cyklu (například dočasná nedostupnost API).

Pří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) # Provedení požadavku na API

    if check_condition(response, expected_condition): # Kontrola podmínky připravenosti
        return True # Podmínka je splněna

    sleep(interval_seconds) # Počkat před dalším kontrolou
    current_time = current_time # Aktualizovat aktuální čas

raise TimeoutError("Zdroj není připraven do stanoveného časového limitu") # Vypršel časový limit

# check_condition(response, expected_condition):
# Logika kontroly podmínky připravenosti na základě odpovědi API
# Například, return response['status'] == 'ready'

Příklad v Pythonu s použitím knihovny requests:

import requests
import time

def wait_for_status(url, expected_status, timeout=60, interval=5):
    """
    Čeká, dokud endpoint nevrátí 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} obdržen.")
                return True
        except requests.exceptions.RequestException as e:
            print(f"[{time.strftime('%H:%M:%S')}] Chyba požadavku: {e}. Opakování za {interval} sekund.")

        time.sleep(interval)

    raise TimeoutError(f"Nelze získat stav {expected_status} do {timeout} sekund.")

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

Volba konkrétní implementace závisí na specifikaci API a požadavcích na testování. Je důležité zajistit flexibilitu v nastavení timeoutů a intervalů, stejně jako informativní zprávy o vypršení časového limitu.