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

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

В стандартном шаблоне выполняются следующие действия:

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

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

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

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

Ресурс API
DriveItem Copy

Необходимые компоненты

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