Длительная операция (LRO) — это метод API, выполнение которого занимает больше времени, чем требуется для ответа API. Обычно нежелательно оставлять вызывающий поток открытым во время выполнения задачи, поскольку это усложняет взаимодействие с пользователем. Вместо этого лучше вернуть пользователю какое-то обещание и позволить ему вернуться позже.
API Google Диска возвращает LRO каждый раз, когда вы вызываете метод download()
ресурса files
для загрузки содержимого файла либо через Drive API, либо через его клиентские библиотеки .
Метод возвращает клиенту operations
ресурс. Вы можете использовать ресурс operations
для асинхронного получения статуса метода API, опрашивая операцию с помощью метода get()
. LRO в Drive API соответствуют шаблону проектирования Google Cloud LRO .
Дополнительные сведения см. в разделе Длительные операции .
Обзор процесса
На следующей диаграмме показаны общие этапы работы метода file.download
.
Вызов
files.download
: когда ваше приложение вызывает методdownload()
, оно запускает запрос на загрузку файла через Drive API. Дополнительную информацию см. в разделе Загрузка файлов .Разрешения на запрос : запрос отправляет учетные данные для аутентификации в Drive API. Если вашему приложению требуется вызов Drive API с использованием аутентификации пользователя, которая еще не предоставлена, оно предлагает пользователю войти в систему. Ваше приложение также запрашивает доступ с областями , которые вы указываете при настройке аутентификации.
Начать загрузку : выполняется запрос Drive API для начала загрузки файла. Запрос можно сделать к Google Vids или другому контенту Google Workspace.
Запустить LRO : начинается длительная операция, управляющая процессом загрузки.
Возврат отложенной операции . Drive API возвращает отложенную операцию, содержащую информацию о пользователе, сделавшем запрос, и несколько полей метаданных файла.
Начальное состояние ожидания : ваше приложение получает ожидающую операцию вместе с начальным состоянием ожидания
done=null
. Это означает, что файл еще не готов к загрузке и что статус операции ожидается.Вызов
operations.get
и проверка результата : ваше приложение вызываетget()
через рекомендуемые интервалы, чтобы опросить результат операции и получить последнее состояние длительной операции. Если возвращается состояние ожиданияdone=false
, ваше приложение должно продолжать опрос до тех пор, пока операция не вернет состояние завершения (done=true
). Для больших файлов ожидайте опроса несколько раз. Дополнительные сведения см. в разделе Получение сведений о длительной операции .Проверка состояния ожидания : если от LRO возвращается состояние ожидания
done=true
, это означает, что файл готов к загрузке и что статус операции завершен.Возврат завершенной операции с URI загрузки . После завершения LRO Drive API возвращает URI загрузки, и файл теперь доступен пользователю.
Скачать файлы
Чтобы загрузить контент в ходе длительной операции, используйте метод download()
для ресурса files
. Метод принимает параметры запроса file_id
, mime_type
и revision_id
:
Необходимый. Параметр запроса
file_id
— это идентификатор файла для загрузки.Необязательный. Параметр запроса
mime_type
обозначает тип MIME, который должен использовать метод. Он доступен только при загрузке медиаконтента, не являющегося BLOB-объектом (например, документов Google Workspace). Полный список поддерживаемых типов MIME см. в разделе Экспорт типов MIME для документов Google Workspace .Если тип MIME не задан, документ Google Workspace загружается с типом MIME по умолчанию. Дополнительные сведения см. в разделе Типы MIME по умолчанию .
Необязательный. Параметр запроса
revision_id
— это идентификатор версии загружаемого файла. Он доступен только при загрузке файлов BLOB-объектов, Документов Google и Таблиц Google. Возвращает код ошибкиINVALID_ARGUMENT
при загрузке определенной версии неподдерживаемых файлов.
Метод download()
— единственный способ загрузить файлы Vids в формате MP4 и обычно лучше всего подходит для загрузки большинства видеофайлов.
Ссылки на скачивание, созданные для Google Docs или Sheets, изначально возвращают перенаправление. Нажмите новую ссылку, чтобы загрузить файл.
Запрос к методу download()
, который запускает LRO, и запрос на получение окончательного URI загрузки должны использовать ключи ресурсов. Дополнительную информацию см. в разделе Доступ к файлам на Диске с общим доступом по ссылке с помощью ключей ресурсов .
Протокол запроса показан здесь.
POST https://www.googleapis.com/drive/v3/files/{FILE_ID
}/download
Замените FILE_ID fileId
файла, который вы хотите загрузить.
Типы MIME по умолчанию
Если тип MIME не задан при загрузке содержимого, не являющегося BLOB-объектом, назначаются следующие типы MIME по умолчанию:
Тип документа | Формат | MIME-тип | Расширение файла |
---|---|---|---|
Скрипт Google Apps | JSON | приложение/vnd.google-apps.script+json | .json |
Google Документы | Microsoft Word | application/vnd.openxmlformats-officedocument.wordprocessingml.document | .docx |
Гугл рисунки | PNG | изображение/png | .png |
Google Формы | Почтовый индекс | приложение/zip | .zip |
Google Таблицы | Майкрософт Эксель | Приложение/vnd.openxmlformats-officedocument.spreadsheetml.sheet | .xlsx |
Google Сайты | Необработанный текст | текст/необработанный | .текст |
Google Презентации | Microsoft PowerPoint | application/vnd.openxmlformats-officedocument.presentationml.presentation | .pptx |
Google Видео | МП4 | приложение/mp4 | .mp4 |
Jamboard | приложение/pdf |
Скачать ответ
При вызове метода download()
тело ответа состоит из ресурса, представляющего длительную операцию. Метод обычно возвращает ссылку для загрузки содержимого файла.
{
"done": true,
"metadata": {
"@type": "type.googleapis.com/google.apps.drive.v3.DownloadFileMetadata",
"resourceKey": "RESOURCE_KEY"
},
"name": "NAME",
"response": {
"@type": "type.googleapis.com/google.apps.drive.v3.DownloadFileResponse",
"downloadUri": "DOWNLOAD_URI",
"partialDownloadAllowed": false
}
}
Этот вывод включает в себя следующие значения:
RESOURCE_KEY : ключ ресурса помогает защитить ваш файл от непреднамеренного доступа. Дополнительную информацию см. в разделе Доступ к файлам на Диске с общим доступом по ссылке с помощью ключей ресурсов .
NAME : имя, назначенное сервером.
DOWNLOAD_URI : окончательный URI загрузки файла.
Обратите внимание, что поле partialDownloadAllowed
указывает, разрешена ли частичная загрузка . Истинно при загрузке содержимого файла больших двоичных объектов.
Получите подробную информацию о длительной операции
Длительные операции — это вызовы методов, выполнение которых может занять значительное время. Обычно вновь созданные операции загрузки изначально возвращаются в состояние ожидания ( done=null
), особенно для файлов Vids.
Вы можете использовать operations
ресурс, предоставляемый Drive API, для проверки статуса обрабатывающего LRO, включив уникальное имя, назначенное сервером.
Метод get()
асинхронно получает последнее состояние длительной операции. Клиенты могут использовать этот метод для опроса результатов операции через определенные промежутки времени, рекомендованные службой API.
Опрос длительной операции
Чтобы опросить доступный LRO, несколько раз вызывайте метод get()
пока операция не завершится. Используйте экспоненциальную задержку между каждым запросом опроса, например 10 секунд.
LRO остается доступным как минимум 12 часов, но в некоторых случаях может действовать дольше. Эта продолжительность может быть изменена и может различаться в зависимости от типа файла. По истечении срока действия ресурса необходим новый запрос метода download()
.
Любые запросы к get()
должны использовать ключи ресурсов. Дополнительную информацию см. в разделе Доступ к файлам на Диске с общим доступом по ссылке с помощью ключей ресурсов .
Протоколы запросов показаны здесь.
Вызов метода
operations.get(name='NAME');
Замените NAME именем, назначенным сервером операции, как показано в ответе на запрос метода download()
.
завиток
curl -i -H \
'Authorization: Bearer $(gcloud auth print-access-token)" \
'https://googleapis.com/drive/v3/operations/NAME?alt=json'
Замените NAME именем, назначенным сервером операции, как показано в ответе на запрос метода download()
.
Команда использует путь /drive/v3/operations/ NAME
.
Обратите внимание, что name
возвращается только в ответ на запрос download()
. Другого способа получить его нет, поскольку Drive API не поддерживает метод List()
. Если значение name
потеряно, необходимо сгенерировать новый ответ, повторно вызвав запрос метода download()
.
Ответ на запрос get()
состоит из ресурса, представляющего длительную операцию. Дополнительную информацию см. в разделе Загрузка ответа .
Когда ответ содержит состояние завершения ( done=true
), длительная операция завершена.
Скачать версию
Вы можете использовать значение поля headRevisionId
из ресурса files
для загрузки последней версии. При этом будет получена версия, соответствующая метаданным файла, который вы получили ранее. Чтобы загрузить данные для всех предыдущих редакций файла, которые все еще хранятся в облаке, вы можете вызвать метод list()
ресурса revisions
с параметром fileId
. Это вернет все revisionIds
в файле.
Чтобы загрузить содержимое ревизии файлов больших двоичных объектов, необходимо вызвать метод get()
ресурса revisions
указав идентификатор загружаемого файла, идентификатор ревизии и параметр URL-адреса alt=media
. Параметр URL-адреса alt=media
сообщает серверу, что в качестве альтернативного формата ответа запрашивается загрузка контента.
Версии Google Docs, Sheets, Slides и Vids нельзя загрузить с помощью метода get()
с URL-адресом alt=media
. В противном случае генерируется ошибка fileNotDownloadable
.
Параметр URL-адреса alt=media
— это системный параметр, доступный во всех API-интерфейсах Google REST. Если вы используете клиентскую библиотеку для Drive API, вам не нужно явно задавать этот параметр.
Протокол запроса показан здесь.
GET https://www.googleapis.com/drive/v3/files/{FILE_ID
}/revisions/{REVISION_ID
}?alt=media
Замените следующее:
- FILE_ID :
fileId
файла, который вы хотите загрузить. - REVISION_ID :
revisionId
ревизии, которую вы хотите загрузить.
В версиях Документов, рисунков и слайдов Google номера версий автоматически увеличиваются. Однако в случае удаления редакций в ряду номеров могут быть пробелы, поэтому не следует полагаться на последовательные номера для получения редакций.
Устранение неполадок LRO
В случае сбоя LRO его ответ включает канонический код ошибки Google Cloud .
В следующей таблице приведены объяснения причин каждого кода и рекомендации по его устранению. В случае многих ошибок рекомендуемым действием является повторная попытка запроса с использованием экспоненциальной задержки .
Подробнее об этой модели ошибок и о том, как с ней работать, можно прочитать в API Design Guide .
Код | Перечисление | Описание | Рекомендуемое действие |
---|---|---|---|
1 | CANCELLED | Операция была отменена, как правило, вызывающей стороной. | Повторите операцию. |
2 | UNKNOWN | Эта ошибка может быть возвращена, если значение Status , полученное из другого адресного пространства, принадлежит пространству ошибок, которое неизвестно в этом адресном пространстве. Если ошибка API не возвращает достаточно информации, ошибка может быть преобразована в эту ошибку. | Повторите попытку с экспоненциальной задержкой. |
3 | INVALID_ARGUMENT | Клиент указал недопустимый аргумент. Эта ошибка отличается от FAILED_PRECONDITION . INVALID_ARGUMENT указывает аргументы, которые являются проблемными независимо от состояния системы, например неправильное имя файла. | Не повторяйте попытку, не устранив проблему. |
4 | DEADLINE_EXCEEDED | Срок истек до завершения операции. Для операций, изменяющих состояние системы, эта ошибка может быть возвращена, даже если операция завершилась успешно. Например, успешный ответ от сервера мог быть отложен на время, достаточное для истечения крайнего срока. | Повторите попытку с экспоненциальной задержкой. |
5 | NOT_FOUND | Некоторый запрошенный объект, например ресурс FHIR, не найден. | Не повторяйте попытку, не устранив проблему. |
6 | ALREADY_EXISTS | Объект, который пытался создать клиент, например экземпляр DICOM, уже существует. | Не повторяйте попытку, не устранив проблему. |
7 | PERMISSION_DENIED | У вызывающего объекта нет разрешения на выполнение указанной операции. Этот код ошибки не означает, что запрос действителен, запрошенный объект существует или удовлетворяет другим предварительным условиям. | Не повторяйте попытку, не устранив проблему. |
8 | RESOURCE_EXHAUSTED | Некоторые ресурсы исчерпаны, например квота на проект. | Повторите попытку с экспоненциальной задержкой. Квота может стать доступной со временем. |
9 | FAILED_PRECONDITION | Операция отклонена, поскольку система не находится в состоянии, необходимом для выполнения операции. Например, удаляемый каталог не пуст или операция rmdir применяется к некаталогу. | Не повторяйте попытку, не устранив проблему. |
10 | ABORTED | Операция была прервана, как правило, из-за проблемы параллелизма, например сбоя проверки секвенсора или прерывания транзакции. | Повторите попытку с экспоненциальной задержкой. |
11 | OUT_OF_RANGE | Была предпринята попытка выполнить операцию за пределами допустимого диапазона, например поиск или чтение за пределами конца файла. В отличие от INVALID_ARGUMENT , эта ошибка указывает на проблему, которую можно устранить, если изменится состояние системы. | Не повторяйте попытку, не устранив проблему. |
12 | UNIMPLEMENTED | Операция не реализована или не поддерживается/не включена в Drive API. | Не повторяйте попытку. |
13 | INTERNAL | Внутренние ошибки. Это указывает на то, что при обработке в базовой системе произошла непредвиденная ошибка. | Повторите попытку с экспоненциальной задержкой. |
14 | UNAVAILABLE | API Диска недоступен. Скорее всего, это временное состояние, которое можно исправить, повторив попытку с экспоненциальной задержкой. Обратите внимание, что не всегда безопасно повторять неидемпотентные операции. | Повторите попытку с экспоненциальной задержкой. |
15 | DATA_LOSS | Невосстановимая потеря или повреждение данных. | Обратитесь к своему системному администратору. Системный администратор может обратиться к представителю службы поддержки в случае потери или повреждения данных. |
16 | UNAUTHENTICATED | В запросе нет действительных учетных данных аутентификации для операции. | Не повторяйте попытку, не устранив проблему. |