Назад к вопросам
Middle
71
questionbank

Как реализовать ожидание (Waiter) для API?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Можно использовать циклический опрос (polling).

  1. Совершить первый запрос к API.
  2. Проверить статус ответа или определенное поле в теле ответа, которое указывает на завершение операции.
  3. Если операция не завершена, дождаться определенный интервал времени.
  4. Повторить запросы, пока операция не завершится или не истечет максимальноеL время ожидания.

Пример реализации на Python с использованием библиотеки requests:

import requests
import time

def wait_for_api_operation(url, expected_status=200, poll_interval=5, timeout=60):
    """
    Ожидает завершения или успешного статуса API-операции.

    :param url: URL эндпоинта
    :param expected_status: Ожидаемый HTTP-статус при завершении (или индикатор завершения в теле ответа)
    :param poll_interval: Интервал между запросами (в секундах)
    :param timeout: Максимальное время ожидания (в секундах)
    :return: Объект Response при успешном завершении
    :raises TimeoutError: Если истекло время ожидания
    :raises Exception: Если получен неожиданный статус до истечения таймаута
    """
    start_time = time.time()
    while time.time() - start_time < timeout:
        try:
            response = requests.get(url)
            # Предполагаем, что завершение определяется по статусу 200
            if response.status_code == expected_status:
                # Добавляем дополнительную проверку, если завершение определяется по полю в ответе
                # if response.json().get('status') == 'completed':
                return response
            elif response.status_code != 202: # Пример: 202 Accepted может означать, что операция еще в процессе
                 raise Exception(f"Получен неожиданный статус {response.status_code}")
        except requests.exceptions.RequestException as e:
            print(f"Ошибка при запросе: {e}") # Логирование для отладки

        time.sleep(poll_interval)

    raise TimeoutError(f"Время ожидания операции {url} истекло")

# Пример использования:
# try:
#     response = wait_for_api_operation("https://api.example.com/task/123/status", expected_status=200, poll_interval=10, timeout=120)
#     print("Операция завершена успешно:", response.json())
# except TimeoutError as e:
#     print(e)
# except Exception as e:
#     print("Произошла ошибка:", e)

Альтернативные методы могут включать:

  • Вебсокеты (WebSockets): Если API поддерживает, сервер может отправить уведомление о завершении операции. Более эффективно, но требует поддержки со стороны API.
  • Колбэки (Callbacks) / Вебхуки (Webhooks): API инициирует обращение к указанному вами URL после завершения операции. Требует наличия доступного для API обработчика.

Выбор зависит от возможностей API и требований к реализации. Циклический опрос — наиболее универсальный метод для API, не предоставляющих продвинутых механизмов уведомления.