Middle
Kuidas rakendada ootamise (Waiter) mustrit API jaoks?
sobes.tech AI
Vastus AI-lt
API ootamise (Waiter) musterite realiseerimine hõlmab ressursi või operatsiooni oleku tsüklilist kontrollimist kuni soovitud tingimus on täidetud või määratud ajapiirang on möödunud.
Peamised sammud:
- Kontrollitava tingimuse määratlemine: Selgelt mõista, millist API või ressursi olekut loetakse "valmis" (näiteks taotluse staatus on muutunud, on ilmnenud uus kirje, on tagastatud oodatud andmed).
- Kontrollimehhanismi valik: Määrata, kuidas oleku kontrolli teostatakse. See võib olla korduv päring samale endpointile, päring spetsiaalsele staatuse endpointile või vastuse sisu kontrollimine.
- Ooteseadete määramine: Seada maksimaalne ooteseaeg (ajapiirang) ja vahemaa kontrollide vahel.
- Tsükli realiseerimine: Luua tsükkel, mis teostab oleku kontrolli määratud intervalliga.
- Väljutehingute töötlemine:
- Väljuda, kui soovitud tingimus on saavutatud.
- Väljuda, kui ajapiirang on möödunud, kaasates erandi või vea.
- Vigade töötlemine kontrolli ajal: Planeerida võimalike vigade töötlemine tsükli sees (näiteks API ajutine kättesaamatus).
Näide pseudokoodis:
# 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) # Tee päring API-le
if check_condition(response, expected_condition): # Kontrolli valmisoleku tingimust
return True # Tingimus on täidetud
sleep(interval_seconds) # Oota enne järgmist kontrolli
current_time = current_time # Uuenda praegune aeg
raise TimeoutError("Resurss ei ole valmis määratud ajaks") # Ajapiirang on möödunud
# check_condition(response, expected_condition):
# Loogika valmisoleku tingimuse kontrollimiseks API vastuse põhjal
# Näiteks, return response['status'] == 'ready'
Python näide requests raamatukoguga:
import requests
import time
def wait_for_status(url, expected_status, timeout=60, interval=5):
"""
Ootab, kuni endpoint tagastab kindla staatuse.
"""
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')}] Staatus {expected_status} saadud.")
return True
except requests.exceptions.RequestException as e:
print(f"[{time.strftime('%H:%M:%S')}] Päringu viga: {e}. Püüdke uuesti {interval} sekundit pärast.")
time.sleep(interval)
raise TimeoutError(f"Ei õnnestunud saada staatus {expected_status} {timeout} sekundiga.")
# Näide kasutusest
# try:
# wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
# print(e)
Konkreetse realiseerimise valik sõltub API spetsiifikast ja testimise nõuetest. Oluline on tagada paindlikkus ajapiirangute ja intervallide seadistamisel ning informatiivsete sõnumite pakkumine ajapiirangu ületamisel.