Sobes.tech
Middle

Hoe implementeer je het wachtpatroon (Waiter) voor API's?

sobes.tech AI

Antwoord van AI

De implementatie van het Waiter-patroon voor API's bestaat uit het cyclisch controleren van de status van de bron of het uitvoeren van een operatie totdat aan de verwachte voorwaarde is voldaan of de ingestelde timeout is verlopen.

Belangrijke stappen:

  1. Definieer de te controleren voorwaarde: Begrijp duidelijk welke staat van de API of bron als "klaar" wordt beschouwd (bijvoorbeeld, de status van het verzoek is veranderd, een nieuwe invoer is verschenen, de verwachte gegevens zijn geretourneerd).
  2. Kies het controlemechanisme: Bepaal hoe de statuscontrole wordt uitgevoerd. Dit kan een herhaalde aanvraag aan dezelfde endpoint zijn, een aanvraag aan een speciale status-endpoint of het controleren van de inhoud van het antwoord.
  3. Stel de wachttijdparameters in: Definieer de maximale wachttijd (timeout) en het interval tussen controles.
  4. Implementeer de lus: Creëer een lus die de statuscontrole met het ingestelde interval uitvoert.
  5. Beheer de uitgangsvoorwaarden:
    • Stop bij het bereiken van de verwachte voorwaarde.
    • Stop bij het verlopen van de timeout, met een uitzondering of foutmelding.
  6. Foutafhandeling tijdens controle: Voorzie in het afhandelen van mogelijke fouten tijdens de uitvoering van de controle binnen de lus (bijvoorbeeld, de API is tijdelijk niet bereikbaar).

Voorbeeld pseudocode:

# 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) # Voer API-aanvraag uit

    if check_condition(response, expected_condition): # Controleer de klaar-voor-actie
        return True # Voorwaarde voldaan

    sleep(interval_seconds) # Wacht voor de volgende controle
    current_time = current_time # Werk de huidige tijd bij

raise TimeoutError("Bron niet klaar binnen timeout") # Timeout verlopen

# check_condition(response, expected_condition):
# Logica voor het controleren van de klaar-voor-actie op basis van API-respons
# Bijvoorbeeld, return response['status'] == 'ready'

Voorbeeld in Python met de requests-bibliotheek:

import requests
import time

def wait_for_status(url, expected_status, timeout=60, interval=5):
    """
    Wacht tot de endpoint een bepaalde status retourneert.
    """
    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} ontvangen.")
                return True
        except requests.exceptions.RequestException as e:
            print(f"[{time.strftime('%H:%M:%S')}] Fout bij verzoek: {e}. Herhaal over {interval} seconden.")

        time.sleep(interval)

    raise TimeoutError(f"Niet gelukt om status {expected_status} te krijgen binnen {timeout} seconden.")

# Voorbeeld gebruik
# try:
#     wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
#     print(e)

De specifieke implementatie hangt af van de API en de testvereisten. Het is belangrijk om flexibiliteit te bieden in het instellen van timeouts en intervallen, en informatieve berichten te geven bij timeout.