处理长时间运行的操作

本文介绍如何在使用 Microsoft Graph API 时处理长时间运行的操作。 某些 API 响应需要不确定的时间才能完成。 Microsoft Graph 可能会使用长时间运行的操作模式,而不是在返回响应之前等待操作完成。 此模式为应用提供了一种轮询长时间运行的操作的状态更新的方法,而无需等待操作完成的任何请求。

常规模式涉及以下步骤:

  1. 应用通过 API 请求长时间运行的操作。 API 接受操作并返回 202 Accepted 响应以及 Location API URL 的标头,以检索操作状态报告。
  2. 你的应用请求操作状态报告 URL,并接收 asyncJobStatus 响应,其中包含长时间运行的操作的进度。
  3. 长时间运行的操作完成。
  4. 你的应用再次请求操作状态报告 URL,并收到一个 异步JobStatus 响应,显示操作完成情况。

先决条件

执行长时间运行的操作所需的相同 权限 也需要查询长时间运行的操作的状态。

初始操作请求

以下示例使用 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 可能不在 Microsoft Graph API 终结点上。

在许多情况下,此步骤是请求的结束,因为复制操作完成时无需应用执行任何其他工作。 但是,如果你的应用需要显示复制操作的状态或确保它完成且没有错误,它可以使用监视 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

操作完成后,来自监视服务的响应将返回结果的资源 ID。

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

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

检索已完成的操作的结果

作业完成后,监视器 URL 返回结果的资源 ID。 在本例中,它是原始项的新副本。 以下示例演示如何使用资源 ID 来寻址此新项。

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
}

支持的资源

以下方法支持长时间运行的操作。

Resource API
driveItem 复制