Sobes.tech
Middle

Ինչպես իրականացնել սպասման (Waiter) դիզայնը API-ի համար?

sobes.tech AI

Պատասխան AI-ից

API-ի սպասման մոդել (Waiter) իրականացումը ներառում է ռեսուրսի կամ գործողության վիճակի ցիկլային ստուգում մինչև սպասվող պայմանը կատարվի կամ նշված ժամանակահատվածը լրանա:

Հիմնական քայլեր՝

  1. Ստուգվող պայմանը սահմանել: Բացատրել, թե որ API կամ ռեսուրսի վիճակը համարվում է "պատրաստ" (օրինակ, հարցման կարգավիճակի փոփոխություն, նոր գրանցման հայտնվել, սպասվող տվյալների վերադարձ)
  2. Ստուգման մեխանիզմ ընտրել: Որոշել, թե ինչպես է կատարվելու վիճակի ստուգումը։ Դա կարող է լինել նույն վերջնակետին կրկնվող հարցում, հատուկ վիճակի վերջնակետին հարցում կամ պատասխան պարունակության ստուգում:
  3. Սպասման պարամետրեր սահմանել: Սահմանել առավելագույն սպասման ժամանակը (timeout) և միջակայքը ստուգումների միջև:
  4. Ցիկլի իրականացում: Ստեղծել ցիկլ, որը կկատարի վիճակի ստուգումը նշված միջակայքով:
  5. Ելքային պայմանների մշակումը:
    • Ելք սպասվող պայմանին հասնելու դեպքում:
    • Ելք ժամանակահատվածի լրանալուց հետո, արտահայտությամբ կամ սխալով:
  6. Սխալների մշակումը ստուգման ժամանակ: Նախատեսել հնարավոր սխալների մշակումը ցիկլի ներսում (օրինակ, API-ի ժամանակավոր հասանելիության բացակայություն):

Օրինակ՝ псևդոկոդ:

# 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) # API-ին հարցում կատարել

    if check_condition(response, expected_condition): # Պատրաստության պայմանը ստուգել
        return True # Պայմանն իրականացվել է

    sleep(interval_seconds) # Սպասել հաջորդ ստուգումից առաջ
    current_time = current_time # Թարմացնել ընթացիկ ժամանակը

raise TimeoutError("Ռեսուրսը պատրաստ չէ նշված ժամանակում") # Ժամկետը լրացել է

# check_condition(response, expected_condition):
# Պայմանի ստուգման տրամաբանություն API-ի պատասխանների հիման վրա
# Օրինակ, return response['status'] == 'ready'

Python-ի օրինակ՝ requests գրադարանի օգտագործմամբ:

import requests
import time

def wait_for_status(url, expected_status, timeout=60, interval=5):
    """
    Սպասում է մինչև վերջնակետը որոշակի կարգավիճակ վերադարձնի:
    """
    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')}] Ստատուս {expected_status} ստացվեց.")
                return True
        except requests.exceptions.RequestException as e:
            print(f"[{time.strftime('%H:%M:%S')}] Խնդիր հարցում: {e}. Կրկնել {interval} վայրկյան հետո.")

        time.sleep(interval)

    raise TimeoutError(f"Չհաջողվեց ստանալ {expected_status} կարգավիճակ {timeout} վայրկյանում:")

# Օգտագործման օրինակ
# try:
#     wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
#     print(e)

Ընտրությունը կոնկրետ իրականացմանը կախված է API-ի բնութագրերից և թեստավորման պահանջներից: Կարևոր է ապահովել ճկունություն ժամանակային սահմանափակումների և միջակայքների կարգավորումների մեջ, ինչպես նաև տեղեկացնող հաղորդագրություններ ժամանակային սահմանափակման ավարտի մասին: