Объединение нескольких запросов в один вызов HTTP с помощью пакетной обработки JSON

Пакетная обработка JSON позволяет оптимизировать приложение путем объединения нескольких запросов (до 20) в один объект JSON. Например, клиенту может потребоваться создать представление несвязанных данных, например:

  • Изображение, хранящееся в OneDrive
  • Список задач Планировщика
  • Календарь группы

Объединение трех этих запросов в один может значительно снизить задержку в сети, ускорив работу приложения.

Microsoft Graph реализует сегмент пути URL-адреса OData $batch для поддержки пакетной обработки JSON.

Первый пакетный запрос JSON

Сначала создается пакетный запрос JSON для предыдущего примера. В этом сценарии отдельные запросы никак не являются взаимозависимыми и, следовательно, могут быть помещены в пакетный запрос в любом порядке.

POST https://graph.microsoft.com/v1.0/$batch
Accept: application/json
Content-Type: application/json

{
  "requests": [
    {
      "id": "1",
      "method": "GET",
      "url": "/me/drive/root:/{file}:/content"
    },
    {
      "id": "2",
      "method": "GET",
      "url": "/me/planner/tasks"
    },
    {
      "id": "3",
      "method": "GET",
      "url": "/groups/{id}/events"
    },
    {
      "id": "4",
      "url": "/me",
      "method": "PATCH",
      "body": {
        "city" : "Redmond"
      },
      "headers": {
        "Content-Type": "application/json"
      }
    },
    {
      "id": "5",
      "url": "users?$select=id,displayName,userPrincipalName&$filter=city eq null&$count=true",
      "method": "GET",
      "headers": {
        "ConsistencyLevel": "eventual"
      }
    }
  ]
}

Ответы на пакетные запросы могут отображаться в другом порядке. Свойство id можно использовать для корреляции отдельных запросов и ответов.

200 OK
Content-Type: application/json

{
  "responses": [
    {
      "id": "1",
      "status": 302,
      "headers": {
        "location": "https://b0mpua-by3301.files.1drv.com/y23vmagahszhxzlcvhasdhasghasodfi"
      }
    },
    {
      "id": "3",
      "status": 401,
      "body": {
        "error": {
          "code": "Forbidden",
          "message": "..."
        }
      }
    },
    {
      "id": "5",
      "status": 200,
      "headers": {
        "OData-Version": "4.0",
      },
      "body": {
        "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users(id,displayName,userPrincipalName)",
        "@odata.count": 12,
        "value": [
          {
            "id": "071cc716-8147-4397-a5ba-b2105951cc0b",
            "displayName": "Adele Vance",
            "userPrincipalName": "AdeleV@Contoso.com"
          }
        ]
      }
    },
    {
      "id": "2",
      "status": 200,
      "body": {
        "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(microsoft.graph.plannerTask)",
        "value": []
      }
    },
    {
      "id": "4",
      "status": 204,
      "body": null
    }
  ]
}

Формат запроса

Пакетные запросы всегда отправляются с помощью метода POST в конечную точку /$batch.

Текст пакетного запроса JSON состоит из одного объекта JSON с одним обязательным свойством: requests. Свойство requests представляет собой коллекцию отдельных запросов. Для каждого отдельного запроса можно передать следующие свойства.

Свойство Описание
id Обязательно. Значение корреляции для связывания отдельных ответов с запросами. Это значение позволяет серверу обрабатывать запросы в пакете в наиболее эффективном порядке.
метод Обязательный аргумент. Метод HTTP.
url Обязательный аргумент. Относительный URL-адрес ресурса, на который обычно отправляется отдельный запрос. Таким образом, если абсолютный URL-адрес выглядит так: https://graph.microsoft.com/v1.0/users, то этот URL-адрес выглядит так: /users.
заголовки Не является обязательным, но требуется, когда указан элементbody. Объект JSON с парой ключей и значений для заголовков. Например, если требуется заголовок ConsistencyLevel, это свойство будет представлено как "headers": {"ConsistencyLevel": "eventual"}. Если предоставлен элемент body, должен быть включен заголовок Content-Type.
body Необязательно. Может быть объектом JSON или значением в кодировке URL Base64 (например, если элемент body является изображением). Когда элемент body включен в запрос, объект headers должен содержать значение для свойства Content-Type.

Формат ответа

Формат ответа для пакетных запросов JSON аналогичен формату запроса. Ниже перечислены основные различия.

  • Свойство в основном объекте JSON называется responses, а не requests.
  • Порядок отображения ответов и запросов может отличаться.
  • Вместо метода и URL-адреса отдельные ответы имеют свойство status . Значение состояния — это число, представляющее код состояния HTTP.
  • Свойство заголовков в каждом отдельном ответе представляет заголовки, возвращаемые сервером, например заголовки Cache-Control и Content-Type.

Пакетный ответ обычно содержит код состояния 200 или 400. Если пакетный запрос имеет неправильный формат, код состояния — 400. Если пакетный запрос пригоден для анализа, код состояния — 200. Код состояния 200 пакетного ответа не указывает на успешное выполнение отдельных запросов в пакете. Вот почему каждый отдельный ответ в свойстве responses имеет код состояния.

Выстраивание последовательности запросов с помощью свойства dependsOn

Отдельные запросы можно выполнять в указанном порядке с помощью свойства dependsOn . Это свойство представляет собой массив строк, ссылающийся на идентификатор другого отдельного запроса. По этой причине значения идентификатора должны быть уникальными. Например, в следующем запросе клиент указывает, что запросы должны выполняться в запросе порядка 1, затем запросе 2, затем запросе 4, а затем запросе 3.

{
  "requests": [
    {
      "id": "1",
      "method": "GET",
      "url": "..."
    },
    {
      "id": "2",
      "dependsOn": [ "1" ],
      "method": "GET",
      "url": "..."
    },
    {
      "id": "4",
      "dependsOn": [ "2" ],
      "method": "GET",
      "url": "..."
    },
    {
      "id": "3",
      "dependsOn": [ "4" ],
      "method": "GET",
      "url": "..."
    }
  ]
}

Если отдельный запрос не будет выполнен, то любой зависящий от него запрос также не будет выполнен с кодом состояния 424 (ошибка зависимости).

Совет

Пакет должен быть полностью последовательным или полностью параллельным.

Обход ограничения на длину URL-адреса с помощью пакетной обработки

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

Ограничения размера пакетов

Пакетные запросы JSON в настоящее время ограничены 20 отдельными запросами в дополнение к следующим ограничениям:

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

Дополнительные сведения см в статье Регулирование и пакетная обработка.

Известные проблемы

Список текущих ограничений, связанных с пакетной обработкой, см. в разделе Известные проблемы.

См. также

Дополнительные сведения о формате пакетных запросов и ответов JSON см. в спецификации формата JSON OData версии 4.01, раздел Пакетные запросы и ответы.