Sobes.tech
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:

  1. 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).
  2. 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.
  3. Ooteseadete määramine: Seada maksimaalne ooteseaeg (ajapiirang) ja vahemaa kontrollide vahel.
  4. Tsükli realiseerimine: Luua tsükkel, mis teostab oleku kontrolli määratud intervalliga.
  5. Väljutehingute töötlemine:
    • Väljuda, kui soovitud tingimus on saavutatud.
    • Väljuda, kui ajapiirang on möödunud, kaasates erandi või vea.
  6. 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.