В этом документе показано, как группировать вызовы API, чтобы сократить количество соединений, которые должен устанавливать ваш клиент. Пакетирование может повысить эффективность приложения за счёт сокращения числа сетевых циклов и увеличения пропускной способности.
Обзор
Каждое соединение, устанавливаемое вашим клиентом, приводит к определённым накладным расходам. API Google Таблиц поддерживает пакетную обработку, позволяя вашему клиенту объединять несколько объектов запроса, каждый из которых определяет один тип запроса для выполнения, в один пакетный запрос. Пакетный запрос может повысить производительность, объединяя несколько подзапросов в один вызов к серверу, получая один ответ.
Мы рекомендуем пользователям всегда объединять несколько запросов в пакеты. Вот несколько примеров ситуаций, в которых можно использовать пакетирование:
- Вы только что начали использовать API и вам нужно загрузить большой объем данных.
- Вам необходимо обновить метаданные или свойства, такие как форматирование, для нескольких объектов.
- Вам нужно удалить много объектов.
Ограничения, авторизация и соображения зависимости
Вот список других моментов, которые следует учитывать при использовании пакетного обновления:
- Каждый пакетный запрос, включая все подзапросы, учитывается как один запрос API в вашем лимите использования .
- Пакетный запрос аутентифицируется один раз. Эта однократная аутентификация применяется ко всем объектам пакетного обновления в запросе.
- Сервер обрабатывает подзапросы в том же порядке, в котором они указаны в пакетном запросе. Последующие подзапросы могут зависеть от действий, выполненных в предыдущих подзапросах. Например, в одном пакетном запросе пользователи могут вставить текст в существующий документ, а затем применить к нему стилистику.
Подробности партии
Пакетный запрос состоит из одного вызова метода batchUpdate с несколькими подзапросами, например, для добавления и последующего форматирования электронной таблицы.
Каждый запрос проверяется перед применением. Все подзапросы в пакетном обновлении применяются атомарно. То есть, если какой-либо запрос недействителен, всё обновление считается неуспешным, и ни одно из (потенциально зависимых) изменений не применяется.
Некоторые запросы предоставляют ответы с информацией о применённых запросах. Например, все запросы на пакетное обновление для добавления объектов возвращают ответы, позволяющие получить доступ к метаданным недавно добавленного объекта, таким как идентификатор или название.
При таком подходе вы можете создать целый документ Google, используя один запрос на пакетное обновление API с несколькими подзапросами.
Формат пакетного запроса
Запрос — это один JSON-запрос, содержащий несколько вложенных подзапросов с одним обязательным свойством: requests . Запросы формируются в массив отдельных запросов. Каждый запрос использует JSON для представления объекта запроса и хранения его свойств.
Формат пакетного ответа
Формат ответа на пакетный запрос аналогичен формату запроса. Ответ сервера содержит полный ответ, состоящий из одного объекта ответа.
Основное свойство объекта JSON называется replies . Ответы возвращаются в массиве, где каждый ответ на один из запросов занимает тот же индекс, что и соответствующий запрос. На некоторые запросы ответов нет, и ответ по этому индексу массива пуст.
Пример
В следующем примере показано использование пакетной обработки с API Таблиц.
Запрос
В этом примере пакетного запроса показано, как:
- Добавьте лист в существующую электронную таблицу с
sheetId12345 с помощьюAddSheetRequest. - Добавьте данные на новый лист, начиная с ячейки A1, с помощью
UpdateCellsRequest. - Добавьте
namedRangeили представление фильтра на новый лист.
Добавляя идентификатор листа в запрос, пользователи могут использовать его для других подзапросов в том же вызове API. Это повышает производительность, исключая цикл «запись-чтение-запись».
Список типов запросов на пакетное обновление, сгруппированных в различные категории, см. в таблице в разделе «Операции пакетного обновления» .
{
"requests":[
{
"addSheet":{
"properties":{
"sheetId":123456
}
}
},
{
"updateCells":{
"start":{
"sheetId":123456
},
"rows":[
{
"values":[
{
"userEnteredValue":{
"stringValue":"hello"
}
}
]
},
{
"values":[
{
"userEnteredValue":{
"stringValue":"world"
}
}
]
}
],
"fields":"userEnteredValue"
}
},
{
"addNamedRange":{
"namedRange":{
"name":"newRange",
"range":{
"sheetId":123456,
"endRowIndex":2
}
}
}
}
]
}Ответ
В этом примере пакетного ответа отображается информация о том, как был применен каждый подзапрос в пакетном запросе. Обратите внимание, что UpdateCellsRequest не содержит ответа, поэтому индексное значение массива в [1] состоит из пустых фигурных скобок.
"replies":[
{
"addSheet":{
"properties":{
"sheetId":123456,
"title":"Sheet3",
"index":2,
"sheetType":"GRID",
"gridProperties":{
"rowCount":1000,
"columnCount":26
}
}
}
},
{
},
{
"addNamedRange":{
"namedRange":{
"namedRangeId":"2104325079",
"name":"newRange",
"range":{
"sheetId":123456,
"startRowIndex":0,
"endRowIndex":2,
"startColumnIndex":0,
"endColumnIndex":26
}
}
}
}
]