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:
- 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).
- 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.
- Nastavení parametrů čekání: Stanovit maximální dobu čekání (timeout) a interval mezi kontrolami.
- Implementace cyklu: Vytvořit cyklus, který bude provádět kontrolu stavu s daným intervalem.
- 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.
- 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.