Перейти к содержимому

Асинхронные операции

Некоторые операции MoreLogin принимают задание до того, как связанный браузер, облачный телефон, файл, приложение или выполнение RPA достигнет конечного состояния. Успешный ответ на отправку означает, что запрос принят, но не всегда означает, что запрошенное состояние уже достигнуто.

Модель состояний на клиенте

СостояниеСмыслДействие клиента
ОтправленоAPI принял команду или создал задачуСохраните возвращённые ID и requestId; не отправляйте ту же запись сразу повторно
Ожидает или выполняетсяПоследующая операция всё ещё идётОпрашивайте задокументированный эндпоинт состояния/результата с растущими интервалами
УспешноЦелевой ресурс или задача достигла успешного конечного состоянияПрекратите опрос и продолжайте сценарий
НеудачноЭндпоинт состояния/результата сообщает об ошибке или конечной бизнес-ошибкеПрекратите автоматические повторы; сохраните ID, детали ошибки и requestId
Результат неизвестенЗапись завершилась тайм-аутом или соединение закрылось без пригодного ответаПрежде чем решать о повторе, запросите текущее состояние ресурса или задачи

Правила опроса

  • Начинайте примерно с 1 секунды, затем увеличивайте интервал до 2, 4, 8 секунд с ограничением 15–30 секунд.
  • Добавляйте дрожание, чтобы несколько клиентов не опрашивали в один момент.
  • Останавливайтесь на задокументированном конечном состоянии; не опрашивайте бесконечно.
  • Считайте data: null ожиданием только тогда, когда эндпоинт явно документирует такое поведение.
  • Тайм-аут передачи при записи не является доказательством неудачи.

Задокументированные сценарии

СценарийОперация отправкиОперация наблюденияКонечное состояние
Запуск/остановка облачного браузераPOST /cloudbrowser/start или /cloudbrowser/stopPOST /cloudbrowser/pageСреда выполнения достигает нужного состояния или исчезает после остановки
Питание облачного телефонаPOST /cloudphone/powerOn или /cloudphone/powerOffPOST /cloudphone/pageenvStatus=4 включён или envStatus=2 выключен; 1 — ошибка создания
Загрузка файла на облачный телефонЗагрузите по подписанному URL, затем POST /cloudphone/uploadFilePOST /cloudphone/uploadFileResultstatus=1 успех или status=2 неудача; data: null и status=0 — ожидание
Скачивание с облачного телефонаPOST /cloudphone/downloadPOST /cloudphone/download/resultstatus=20 успех, 30 неудача или 40 отменено; 10 — выполняется
Установка приложенияPOST /cloudphone/app/installPOST /cloudphone/app/installedListЗапрошенный пакет появляется в списке установленных приложений
Расписание/выполнение RPAPOST /cloudphone/rpa/task/save или /onceTask/savePOST /cloudphone/rpa/task/page, /subTask/page и /subTask/detail/{id}taskState=2 завершено или 3 отменено; проверьте handleResult (0 неудача, 1 успех)
Прямые трансляцииPOST /cloudphone/live/start или /live/endPOST /cloudphone/live/statusСтатус подтверждает, что трансляция началась или остановлена
Загрузка в облачное хранилищеPOST /cloudstorage/upload/init, затем PUT в объектное хранилищеPOST /cloudstorage/upload/complete после успеха каждого необходимого PUTЗапрос завершения успешен; никогда не вызывайте complete до успешной загрузки объекта

Аналоги в Local API используют префикс /api там, где это задокументировано. Рекомендации по каждой операции см. в Матрице повторов и завершения операций.

Пример восстановления после тайм-аута

try:
    submit_operation()
except TimeoutError:
    # The write may already have succeeded.
    current = query_current_state()
    if current.is_terminal_success:
        pass
    elif current.is_pending:
        poll_until_terminal()
    else:
        decide_whether_retry_is_safe(current)

Публичный API сейчас не определяет общий заголовок ключа идемпотентности. Поэтому ID ресурсов, ID задач, запросы состояния и requestId критичны для безопасного восстановления.