Поделиться через


Работа с действиями, выполняющимися длительное время

В этой статье описывается, как работать с длительными действиями при использовании API Microsoft Graph. Для выполнения некоторых ответов API требуется неопределенное время. Вместо того чтобы ждать завершения действия перед возвратом ответа, Microsoft Graph может использовать шаблон длительных действий. Этот шаблон предоставляет приложению способ опроса на наличие обновлений состояния для длительного действия без запроса, ожидающего завершения действия.

Общий шаблон включает в себя следующие шаги:

  1. Приложение запрашивает длительное действие через API. API принимает действие и возвращает ответ вместе с заголовком 202 AcceptedLocation URL-адреса API для получения отчетов о состоянии действий.
  2. Приложение запрашивает URL-адрес отчета о состоянии действия и получает ответ asyncJobStatus о ходе выполнения длительного действия.
  3. Длительное действие завершается.
  4. Приложение снова запрашивает URL-адрес отчета о состоянии действия и получает ответ asyncJobStatus , показывающий завершение действия.

Предварительные условия

Те же разрешения , необходимые для выполнения длительного действия, также требуются для запроса состояния длительного действия.

Начальный запрос действия

В следующем примере используется метод driveitem: copy . В этом сценарии приложение отправляет запрос на копирование папки, содержащей большой объем данных. Выполнение этого запроса, скорее всего, займет несколько секунд, так как объем данных большой.

POST https://graph.microsoft.com/beta/me/drive/items/{folder-item-id}/copy
Content-Type: application/json

{
  "parentReference": {
    "path": "/drive/root:/Documents"
  },
  "name": "Copy of LargeFolder1"
}

API отвечает, что действие было принято, и предоставляет URL-адрес для получения состояния длительного действия.

HTTP/1.1 202 Accepted
Location: https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717

Примечание: Возвращаемый URL-адрес расположения может не находиться в конечной точке API Microsoft Graph.

Во многих случаях этот шаг является завершением запроса, так как действие копирования завершается без каких-либо других действий из приложения. Однако если приложению нужно отобразить состояние действия копирования или убедиться, что оно будет выполнено без ошибок, оно может сделать это с помощью URL-адреса монитора.

Получение отчета о состоянии с URL-адреса для отслеживания

Чтобы проверить состояние действия копирования, приложение отправляет запрос на URL-адрес, указанный в предыдущем отклике.

Примечание: Этот запрос не требует проверки подлинности, так как URL-адрес является краткосрочным и уникальным для исходного вызывающего объекта.

GET https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717

Служба отвечает информацией о том, что длительное действие все еще выполняется.

HTTP/1.1 202 Accepted
Content-type: application/json

{
  "operation": "ItemCopy",
  "percentageComplete": 27.8,
  "status": "inProgress"
}

Эти сведения можно использовать для обновления информации о ходе копирования для пользователя. Приложение может продолжить опрашивать URL-адрес для отслеживания, чтобы получать обновленные сведения о ходе выполнения действия.

Получение отчета о выполнении действия с URL-адреса для отслеживания

Через несколько секунд операция копирования завершается. На этот раз, когда приложение отправляет запрос к URL-адресу монитора, ответ представляет собой перенаправление на готовый результат действия.

GET https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717

По завершении действия ответ от службы мониторинга возвращает идентификатор ресурса для результатов.

HTTP/1.1 202 Accepted
Content-type: application/json

{
    "percentageComplete": 100.0,
    "resourceId": "01MOWKYVJML57KN2ANMBA3JZJS2MBGC7KM",
    "status": "completed"
}

Получение результатов выполненной операции

После завершения задания URL-адрес монитора возвращает идентификатор ресурса результата. В этом случае это новая копия исходного элемента. В следующем примере показано, как обратиться к этому новому элементу с помощью идентификатора ресурса.

GET https://graph.microsoft.com/beta/me/drive/items/{item-id}
HTTP/1.1 200 OK
Content-type: application/json

{
    "id": "",
    "name": "Copy of LargeFolder1",
    "folder": { },
    "size": 12019
}

Поддерживаемые ресурсы

Длительные действия поддерживаются в следующих методах.

Ресурс API
driveItem copy