处理长时间运行的操作

本文介绍如何在使用 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 图形 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 复制