В этом документе рассматриваются некоторые методы, которые можно использовать для повышения производительности вашего приложения. В некоторых случаях для иллюстрации представленных идей используются примеры из других API или универсальных API. Однако те же концепции применимы и к API Google Таблиц.
Сжатие с помощью gzip
Простой и удобный способ сократить пропускную способность, необходимую для каждого запроса, — включить сжатие gzip. Хотя это требует дополнительного процессорного времени для распаковки результатов, компромисс с сетевыми затратами обычно оправдывает себя.
Чтобы получить ответ, закодированный с помощью gzip, необходимо выполнить два действия: установить заголовок Accept-Encoding
и изменить пользовательский агент, добавив строку gzip
. Вот пример правильно сформированных HTTP-заголовков для включения сжатия gzip:
Accept-Encoding: gzip User-Agent: my program (gzip)
Работа с частичными ресурсами
Еще один способ повысить производительность вызовов API — запрашивать только ту часть данных, которая вам интересна. Это позволяет приложению избежать передачи, анализа и хранения ненужных полей, что позволяет ему более эффективно использовать ресурсы, включая сеть, ЦП и память.
Частичный ответ
По умолчанию сервер отправляет полное представление ресурса после обработки запросов. Для повышения производительности вы можете попросить сервер отправлять только те поля, которые вам действительно нужны, и вместо этого получать частичный ответ .
Чтобы запросить частичный ответ, используйте параметр запроса fields
, чтобы указать поля, которые нужно вернуть. Этот параметр можно использовать с любым запросом, возвращающим данные ответа.
Пример
В следующем примере показано использование параметра fields
с универсальным (вымышленным) «Demo» API.
Простой запрос: этот HTTP-запрос GET
пропускает параметр fields
и возвращает полный ресурс.
https://www.googleapis.com/demo/v1
Полный ответ о ресурсе: Полные данные о ресурсе включают в себя следующие поля, а также многие другие, которые были опущены для краткости.
{ "kind": "demo", ... "items": [ { "title": "First title", "comment": "First comment.", "characteristics": { "length": "short", "accuracy": "high", "followers": ["Jo", "Will"], }, "status": "active", ... }, { "title": "Second title", "comment": "Second comment.", "characteristics": { "length": "long", "accuracy": "medium" "followers": [ ], }, "status": "pending", ... }, ... ] }
Запрос частичного ответа: Следующий запрос к этому же ресурсу использует параметр fields
для значительного сокращения объема возвращаемых данных.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Частичный ответ: в ответ на запрос, указанный выше, сервер отправляет ответ, содержащий только информацию о типе вместе с урезанным массивом элементов, который включает только заголовок HTML и информацию о характеристиках длины для каждого элемента.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Обратите внимание, что ответ представляет собой объект JSON, который включает только выбранные поля и содержащие их родительские объекты.
Далее будут рассмотрены подробности форматирования параметра fields
, а затем — более подробная информация о том, что именно возвращается в ответе.
Сводка синтаксиса параметров полей
Формат значения параметра запроса fields
в некоторой степени основан на синтаксисе XPath. Поддерживаемый синтаксис описан ниже, а дополнительные примеры приведены в следующем разделе.
- Для выбора нескольких полей используйте список, разделенный запятыми.
- Используйте
a/b
для выбора поляb
, вложенного в полеa
; используйтеa/b/c
для выбора поляc
вложенного вb
.Исключение: для ответов API, использующих обёртки "data", где ответ вложен в объект
data
, который выглядит какdata: { ... }
, не включайте "data
" в спецификациюfields
. Включение объекта данных вместе со спецификацией полей, напримерdata/a/b
приведёт к ошибке. Вместо этого используйте просто спецификациюfields
, например,a/b
. - Используйте подселектор для запроса набора определенных подполей массивов или объектов, поместив выражения в скобки «
( )
».Например,
fields=items(id,author/email)
возвращает только идентификатор элемента и адрес электронной почты автора для каждого элемента массива items. Вы также можете указать одно подполе, гдеfields=items(id)
эквивалентноfields=items/id
. - При необходимости используйте подстановочные знаки при выборе полей.
Например:
fields=items/pagemap/*
выбирает все объекты на карте страницы.
Дополнительные примеры использования параметра fields
Примеры ниже содержат описания того, как значение параметра fields
влияет на ответ.
Примечание: Как и все значения параметров запроса, значение параметра fields
должно быть закодировано в URL. Для удобства чтения в примерах в этом документе кодировка не указана.
- Определите поля, которые вы хотите вернуть, или сделайте выбор полей .
- Значение параметра запроса
fields
представляет собой список полей, разделённых запятыми, и каждое поле указывается относительно корня ответа. Таким образом, при выполнении операции со списком ответ представляет собой коллекцию, которая обычно включает массив ресурсов. Если выполняется операция, возвращающая один ресурс, поля указываются относительно этого ресурса. Если выбранное вами поле является массивом (или является его частью), сервер возвращает выбранную часть всех элементов массива.
Вот несколько примеров на уровне коллекций:Примеры Эффект items
Возвращает все элементы массива items, включая все поля в каждом элементе, но не включает другие поля. etag,items
Возвращает как поле etag
, так и все элементы в массиве items.items/title
Возвращает только поле title
для всех элементов массива items.
При возврате вложенного поля ответ включает в себя родительские объекты, которые его содержат. Родительские поля не включают в себя никакие другие дочерние поля, если только они не выбраны явно.context/facets/label
Возвращает только поле label
для всех членов массиваfacets
, который сам по себе вложен в объектcontext
.items/pagemap/*/title
Для каждого элемента массива items возвращает только поле title
(если оно есть) всех объектов, являющихся дочерними элементамиpagemap
.
Вот несколько примеров на уровне ресурсов:Примеры Эффект title
Возвращает поле title
запрошенного ресурса.author/uri
Возвращает подполе uri
объектаauthor
в запрошенном ресурсе.links/*/href
Возвращает поле href
всех объектов, являющихся дочерними элементамиlinks
. - Запросите только части определенных полей, используя подвыборки .
- По умолчанию, если в запросе указаны определённые поля, сервер возвращает объекты или элементы массива целиком. Вы можете указать ответ, включающий только определённые подполя. Это можно сделать, используя синтаксис подвыборки «
( )
», как в примере ниже.Пример Эффект items(title,author/uri)
Возвращает только значения title
иuri
автора для каждого элемента в массиве элементов.
Обработка частичных ответов
После обработки сервером корректного запроса, включающего параметр запроса fields
, он возвращает код статуса HTTP 200 OK
вместе с запрошенными данными. Если параметр запроса fields
содержит ошибку или недействителен по какой-либо другой причине, сервер возвращает код статуса HTTP 400 Bad Request
вместе с сообщением об ошибке, сообщающим пользователю о причине ошибки в выборе полей (например, "Invalid field selection a/b"
).
Вот пример частичного ответа, показанный во вводном разделе выше. В запросе используется параметр fields
для указания возвращаемых полей.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Частичный ответ выглядит так:
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Примечание: Для API, поддерживающих параметры запросов для пагинации данных (например, maxResults
и nextPageToken
), используйте эти параметры, чтобы уменьшить размер результатов каждого запроса до приемлемого. В противном случае выигрыш в производительности, возможный при частичном ответе, может быть не реализован.