Middle
Kako implementirati obrazac čekanja (Waiter) za API?
sobes.tech АИ
Одговор од АИ
Implementacija obrasca Waiter za API uključuje cikličku proveru stanja resursa ili izvršenje operacije dok se ne postigne očekivani uslov ili ne istekne zadato vreme za čekanje.
Glavni koraci:
- Definisanje uslova provere: Jasno shvatiti koje stanje API-ja ili resursa se smatra "spremnim" (npr. promena statusa zahteva, pojavljivanje nove evidencije, vraćeni očekivani podaci).
- Izbor mehanizma provere: Odrediti kako će se vršiti provera stanja. To može biti ponovni zahtev na isti endpoint, zahtev na poseban endpoint za status ili provera sadržaja odgovora.
- Podešavanje parametara čekanja: Postaviti maksimalno vreme čekanja (timeout) i interval između provera.
- Implementacija petlje: Kreirati petlju koja će vršiti proveru stanja sa zadatim intervalom.
- Obrada uslova za izlazak:
- Izlazak pri postizanju očekivanog uslova.
- Izlazak pri isteku timeout-a, praćen izuzetkom ili greškom.
- Obrada grešaka pri proveri: Predvideti obradu mogućih grešaka tokom izvršavanja provere unutar petlje (npr. privremena nedostupnost API-ja).
Primer pseudokoda:
# 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) # Izvršiti zahtev ka API-ju
if check_condition(response, expected_condition): # Proveriti uslov spremnosti
return True # Uslov je postignut
sleep(interval_seconds) # Sačekati pre sledeće provere
current_time = current_time # Ažurirati trenutno vreme
raise TimeoutError("Resurs nije spreman u okviru zadanog vremena") # Timeout je istekao
# check_condition(response, expected_condition):
# Logika provere uslova spremnosti na osnovu odgovora API-ja
# Na primer, return response['status'] == 'ready'
Primer u Python-u koristeći biblioteku requests:
import requests
import time
def wait_for_status(url, expected_status, timeout=60, interval=5):
"""
Čeka dok endpoint ne vrati određeni status.
"""
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')}] Status {expected_status} primljen.")
return True
except requests.exceptions.RequestException as e:
print(f"[{time.strftime('%H:%M:%S')}] Greška zahteva: {e}. Pokušaj ponovo za {interval} sekundi.")
time.sleep(interval)
raise TimeoutError(f"Nije uspeo da dobije status {expected_status} u roku od {timeout} sekundi.")
# Primer upotrebe
# try:
# wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
# print(e)
Izbor konkretne implementacije zavisi od specifikacije API-ja i zahteva za testiranje. Važno je obezbediti fleksibilnost u podešavanju timeoutova i intervala, kao i informativne poruke o isteku vremena.