Назад к вопросам
Middle
71
questionbank
Как реализовать ожидание (Waiter) для API?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Можно использовать циклический опрос (polling).
- Совершить первый запрос к API.
- Проверить статус ответа или определенное поле в теле ответа, которое указывает на завершение операции.
- Если операция не завершена, дождаться определенный интервал времени.
- Повторить запросы, пока операция не завершится или не истечет максимальное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, не предоставляющих продвинутых механизмов уведомления.