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:
- 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).
- 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.
- Nastavenie parametrov čakania: Stanoviť maximálny čas čakania (timeout) a interval medzi kontrolami.
- Implementácia slučky: Vytvoriť slučku, ktorá bude vykonávať kontrolu stavu s daným intervalom.
- Spracovanie podmienok ukončenia:
- Ukončenie pri dosiahnutí očakávanej podmienky.
- Ukončenie pri vypršaní timeoutu, sprevádzané výnimkou alebo chybou.
- 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.