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

В этом документе показано, как группировать вызовы API, чтобы сократить количество соединений, которые должен устанавливать ваш клиент. Пакетирование может повысить эффективность приложения за счёт сокращения числа сетевых циклов и увеличения пропускной способности.

Обзор

Каждое соединение, устанавливаемое вашим клиентом, приводит к определённым накладным расходам. API Google Docs поддерживает пакетную обработку, позволяя вашему клиенту объединять несколько объектов запроса, каждый из которых определяет один тип запроса для выполнения, в один пакетный запрос. Пакетный запрос может повысить производительность, объединяя несколько подзапросов в один вызов к серверу, получая один ответ.

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

  • Вы только что начали использовать API и вам нужно загрузить большой объем данных.
  • Вам необходимо обновить метаданные или свойства, такие как форматирование, для нескольких объектов.
  • Вам нужно удалить много объектов.

Ограничения, авторизация и соображения зависимости

Вот список других моментов, которые следует учитывать при использовании пакетного обновления:

  • Каждый пакетный запрос, включая все подзапросы, учитывается как один запрос API в вашем лимите использования .
  • Пакетный запрос аутентифицируется один раз. Эта однократная аутентификация применяется ко всем объектам пакетного обновления в запросе.
  • Сервер обрабатывает подзапросы в том же порядке, в котором они указаны в пакетном запросе. Последующие подзапросы могут зависеть от действий, выполненных в предыдущих подзапросах. Например, в одном пакетном запросе пользователи могут вставить текст в существующий документ, а затем применить к нему стилистику.

Подробности партии

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

Каждый запрос проверяется перед применением. Все подзапросы в пакетном обновлении применяются атомарно. То есть, если какой-либо запрос недействителен, всё обновление считается неуспешным, и ни одно из (потенциально зависимых) изменений не применяется.

Некоторые запросы предоставляют ответы с информацией о применённых запросах. Например, все запросы на пакетное обновление для добавления объектов возвращают ответы, позволяющие получить доступ к метаданным недавно добавленного объекта, таким как идентификатор или название.

При таком подходе вы можете создать целый документ Google, используя один запрос на пакетное обновление API с несколькими подзапросами.

Формат пакетного запроса

Запрос — это один JSON-запрос, содержащий несколько вложенных подзапросов с одним обязательным свойством: requests . Запросы формируются в массив отдельных запросов. Каждый запрос использует JSON для представления объекта запроса и хранения его свойств.

Формат пакетного ответа

Формат ответа на пакетный запрос аналогичен формату запроса. Ответ сервера содержит полный ответ, состоящий из одного объекта ответа.

Основное свойство объекта JSON называется replies . Ответы возвращаются в массиве, где каждый ответ на один из запросов занимает тот же индекс, что и соответствующий запрос. На некоторые запросы ответов нет, и ответ по этому индексу массива пуст.

Пример

В следующем примере кода показано использование пакетной обработки с API Docs.

Запрос

В этом примере пакетного запроса показано, как:

  • Вставьте текст «Hello World» в начало существующего документа с location 1 , используя InsertTextRequest .

  • Обновите слово «Hello» с помощью UpdateTextStyleRequest . Параметры startIndex и endIndex определяют range форматированного текста в сегменте.

  • Используя textStyle , установите жирный стиль шрифта и синий цвет только для слова «Hello».

  • Используя поле WriteControl , вы можете управлять выполнением запросов на запись. Подробнее см. в разделе «Установление согласованности состояния с помощью WriteControl» .

{
   "requests":[
      {
         "insertText":{
            "location":{
               "index":1,
               "tabId":TAB_ID
            },
            "text":"Hello World"
         }
      },
      {
         "updateTextStyle":{
            "range":{
               "startIndex":1,
               "endIndex":6
            },
            "textStyle":{
               "bold":true,
               "foregroundColor":{
                  "color":{
                     "rgbColor":{
                        "blue":1
                     }
                  }
               }
            },
            "fields":"bold,foreground_color"
         }
      }
   ],
   "writeControl": {
      "requiredRevisionId": "REQUIRED_REVISION_ID"
  }
}

Замените TAB_ID и REQUIRED_REVISION_ID на идентификатор вкладки и идентификатор редакции документа, к которому применяется запрос на запись, соответственно.

Ответ

В этом примере пакетного ответа отображается информация о том, как был применен каждый подзапрос в пакетном запросе. Ни запросы InsertTextRequest , ни запросы UpdateTextStyleRequest не содержат ответа, поэтому индексные значения массива [0] и [1] состоят из пустых фигурных скобок. Пакетный запрос отображает объект WriteControl , который показывает, как были выполнены запросы.

{
   "replies":[
      {},
      {}
   ],
   "writeControl":{
      "requiredRevisionId":`REQUIRED_REVISION_ID`
   },
   "documentId":`DOCUMENT_ID`
}