Длительная операция (LRO) — это метод API, выполнение которого занимает больше времени, чем это допустимо для ответа API. Как правило, нежелательно удерживать вызывающий поток открытым во время выполнения задачи, поскольку это ухудшает пользовательский опыт. Вместо этого лучше вернуть пользователю какое-либо обещание и позволить ему проверить результат позже.
API Google Drive возвращает LRO каждый раз, когда вы вызываете метод download ресурса files для загрузки содержимого файла либо через API Drive, либо через его клиентские библиотеки .
Этот метод возвращает клиенту ресурс operations . Вы можете использовать ресурс operations для асинхронного получения статуса метода API, опрашивая операцию через метод get . LRO в Drive API соответствуют шаблону проектирования LRO от Google Cloud .
Для получения более подробной информации см. раздел «Длительные операции» .
Обзор процесса
На следующей диаграмме показаны основные этапы работы метода file.download .
Вызов метода
files.download: Когда ваше приложение вызывает методdownload, оно запускает запрос на загрузку файла через Google Drive API. Для получения дополнительной информации см. раздел «Загрузка файлов» .Запрос разрешений : Запрос отправляет учетные данные для аутентификации в API Google Диска. Если вашему приложению требуется вызов API Google Диска с использованием аутентификации пользователя, которая еще не предоставлена, оно запрашивает у пользователя вход в систему. Ваше приложение также запрашивает доступ с областями действия , которые вы указываете при настройке аутентификации.
Начало загрузки : Для начала загрузки файла отправляется запрос к API Google Диска. Запрос может быть отправлен в Google Видео или к другому контенту Google Рабочего пространства.
Запуск LRO : Начинается длительная операция, которая управляет процессом загрузки.
Возвращает ожидающую операцию : API Google Drive возвращает ожидающую операцию, содержащую информацию о пользователе, отправившем запрос, и несколько полей метаданных файла.
Начальное состояние ожидания : Ваше приложение получает сообщение об ожидающей операции вместе с начальным состоянием ожидания
done=null. Это означает, что файл еще не готов к загрузке и что статус операции — ожидание.Вызовите
operations.getи проверьте результат : ваше приложение вызывает методgetс рекомендуемыми интервалами для опроса результата операции и получения последнего состояния длительной операции. Если возвращается состояние ожиданияdone=false, ваше приложение должно продолжать опрос до тех пор, пока операция не вернет состояние завершения (done=true). Для больших файлов ожидайте многократных опросов. Для получения дополнительной информации см. раздел «Получение подробной информации о длительной операции» .Проверка состояния ожидания : если LRO возвращает состояние ожидания
done=true, это означает, что файл готов к загрузке и операция завершена.Возвращает завершенную операцию с URI загрузки : После завершения LRO API Google Drive возвращает 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 Docs и таблиц Google Sheets. Возвращает код ошибкиINVALID_ARGUMENTпри загрузке определенной ревизии для неподдерживаемых файлов.
Метод download — единственный способ скачать видеофайлы в формате MP4, и он, как правило, лучше всего подходит для загрузки большинства видеофайлов. При попытке экспорта файлов Google Vids вы получите ошибку fileNotExportable .
Ссылки для скачивания, сгенерированные для Google Docs или Sheets, изначально приводят к перенаправлению. Щелкните по новой ссылке, чтобы загрузить файл.
Запрос к методу download запускающему LRO, и запрос на получение конечного URI загрузки должны использовать ключи ресурсов. Дополнительную информацию см. в разделе «Доступ к файлам Google Диска, доступным по ссылкам, с помощью ключей ресурсов» .
Здесь представлен протокол запроса.
POST https://www.googleapis.com/drive/v3/files/{FILE_ID}/download Замените FILE_ID на fileId файла, который вы хотите загрузить.
Типы MIME по умолчанию
Если при загрузке контента, не являющегося BLOB-объектом, не указан MIME-тип, по умолчанию назначаются следующие MIME-типы:
| Тип документа | Формат | MIME-тип | Расширение файла |
|---|---|---|---|
| Google Apps Script | JSON | application/vnd.google-apps.script+json | .json |
| Google Документы | Microsoft Word | application/vnd.openxmlformats-officedocument.wordprocessingml.document | .docx |
| Рисунки Google | ПНГ | изображение/png | .png |
| Google Формы | ZIP | приложение/zip | .zip |
| Google Таблицы | Microsoft Excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | .xlsx |
| Сайты Google | Исходный текст | текст/сырой | .текст |
| Google Слайды | Microsoft PowerPoint | application/vnd.openxmlformats-officedocument.presentationml.presentation | .pptx |
| Google Видео | MP4 | видео/mp4 | .mp4 |
| Джемборд | application/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 : Ключ ресурса помогает защитить ваш файл от несанкционированного доступа. Для получения дополнительной информации см. раздел «Доступ к файлам Google Диска, используемым в качестве общего ресурса, с помощью ключей ресурсов» .
NAME : Имя, присвоенное сервером.
DOWNLOAD_URI : Конечный URI для загрузки файла.
Обратите внимание, что поле partialDownloadAllowed указывает, разрешена ли частичная загрузка , и принимает true при загрузке содержимого BLOB-файла.
Узнайте подробности о давно работающей операции.
Длительные операции — это вызовы методов, выполнение которых может занять значительное количество времени. Как правило, вновь созданные операции загрузки изначально возвращаются в состоянии ожидания ( done=null ), особенно это касается видеофайлов.
Вы можете использовать ресурс operations , предоставляемый API Drive, чтобы проверить статус обработки LRO, указав уникальное имя, присвоенное сервером.
Метод get асинхронно получает последнее состояние длительной операции. Клиенты могут использовать этот метод для опроса результата операции с интервалами, рекомендованными API-сервисом.
Опрос – это давно существующая операция.
Для опроса доступного LRO многократно вызывайте метод get до завершения операции. Используйте экспоненциальную задержку между каждым запросом на опрос, например, 10 секунд.
Доступ к файлу LRO сохраняется как минимум 12 часов, но в некоторых случаях может быть продлен. Этот период может меняться и различаться в зависимости от типа файла. После истечения срока действия ресурса необходимо запросить новый способ download .
При выполнении любых запросов на get следует использовать ключи ресурсов. Дополнительную информацию см. в разделе «Доступ к файлам Google Диска, доступным по ссылкам, с помощью ключей ресурсов» .
Здесь представлены протоколы запросов.
Вызов метода
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 . Другого способа получить его нет, поскольку API Google Drive не поддерживает метод list . Если значение name потеряно, необходимо сгенерировать новый ответ, повторно вызвав метод download .
Ответ на get -запрос представляет собой ресурс, отражающий длительную операцию. Для получения дополнительной информации см. раздел «Загрузка ответа» .
Когда ответ содержит состояние "завершено" ( done=true ), длительная операция завершена.
Скачать исправленную версию
Вы можете использовать значение поля headRevisionId из ресурса files для загрузки последней ревизии. Это позволит получить ревизию, соответствующую метаданным файла, который вы получили ранее. Чтобы загрузить данные для всех предыдущих ревизий файла, которые все еще хранятся в облаке, вы можете вызвать метод list ресурса revisions с параметром fileId . Это вернет все revisionIds в файле.
Для загрузки содержимого ревизий BLOB-файлов необходимо вызвать метод get ресурса ` revisions , указав идентификатор загружаемого файла, идентификатор ревизии и параметр ` alt=media URL`. Параметр alt=media URL` сообщает серверу, что запрашивается загрузка содержимого в альтернативном формате ответа.
Редактирование документов Google Docs, Sheets, Slides и видеороликов невозможно загрузить с помощью метода get с URL-адресом alt=media . В противном случае возникает ошибка fileNotDownloadable .
Параметр URL-адреса alt=media является системным параметром, доступным для всех REST API Google. Если вы используете клиентскую библиотеку для API Google Drive, вам не нужно явно указывать этот параметр.
Здесь представлен протокол запроса.
GET https://www.googleapis.com/drive/v3/files/{FILE_ID}/revisions/{REVISION_ID}?alt=mediaЗамените следующее:
- FILE_ID :
fileIdфайла, который вы хотите загрузить. - REVISION_ID :
revisionIdревизии, которую вы хотите загрузить.
В документах Google Docs, Drawings и Slides номера версий автоматически увеличиваются. Однако в последовательности чисел могут быть пробелы, если версии были удалены, поэтому не следует полагаться на последовательные номера для восстановления версий.
Устранение неполадок LRO
При сбое LRO в ответе отображается стандартный код ошибки Google Cloud .
В следующей таблице отображается каждый код ошибки, соответствующий код состояния HTTP, описание и рекомендации по обработке кода ошибки. Для многих ошибок рекомендуется повторить запрос, используя экспоненциальную задержку .
Более подробную информацию об этой модели ошибок и способах работы с ней можно найти в Руководстве по проектированию API .
| Код | Перечисление | код состояния HTTP | Описание | Рекомендуемые действия |
|---|---|---|---|---|
| 1 | CANCELLED | 499 Client Closed Request | Операция была отменена, как правило, самим звонившим. | Повторите операцию. |
| 2 | UNKNOWN | 500 Internal Server Error | Эта ошибка может быть возвращена, если значение Status , полученное из другого адресного пространства, принадлежит пространству ошибок, которое неизвестно в данном адресном пространстве. Если ошибка API не содержит достаточно информации, она может быть преобразована в эту ошибку. | Повторите попытку с экспоненциальной задержкой. |
| 3 | INVALID_ARGUMENT | 400 Bad Request | Клиент указал недопустимый аргумент. Эта ошибка отличается от FAILED_PRECONDITION . INVALID_ARGUMENT указывает на аргументы, которые являются проблематичными независимо от состояния системы, например, некорректное имя файла. | Не повторяйте попытку, пока не устраните проблему. |
| 4 | DEADLINE_EXCEEDED | 504 Gateway Timeout | Срок выполнения операции истёк до её завершения. Для операций, изменяющих состояние системы, эта ошибка может быть возвращена даже в случае успешного завершения операции. Например, успешный ответ от сервера мог быть задержан настолько, что истек срок выполнения операции. | Повторите попытку с экспоненциальной задержкой. |
| 5 | NOT_FOUND | 404 Not Found | Некоторые запрошенные объекты, например, ресурсы FHIR, не были найдены. | Не повторяйте попытку, пока не устраните проблему. |
| 6 | ALREADY_EXISTS | 409 Conflict | Объект, который клиент пытался создать, например, экземпляр DICOM, уже существует. | Не повторяйте попытку, пока не устраните проблему. |
| 7 | PERMISSION_DENIED | 403 Forbidden | У вызывающей стороны нет разрешения на выполнение указанной операции. Этот код ошибки не означает, что запрос действителен, запрашиваемый объект существует или удовлетворяет другим предварительным условиям. | Не повторяйте попытку, пока не устраните проблему. |
| 8 | RESOURCE_EXHAUSTED | 429 Too Many Requests | Часть ресурсов исчерпана, например, квота на каждый проект. | Повторите попытку с экспоненциальной задержкой. Квота может стать доступной со временем. |
| 9 | FAILED_PRECONDITION | 400 Bad Request | Операция была отклонена, поскольку система не находится в состоянии, необходимом для ее выполнения. Например, удаляемый каталог не пуст, или операция rmdir применяется к объекту, не являющемуся каталогом. | Не повторяйте попытку, пока не устраните проблему. |
| 10 | ABORTED | 409 Conflict | Операция была прервана, как правило, из-за проблемы параллельного выполнения, например, из-за сбоя проверки последовательности или прерывания транзакции. | Повторите попытку с экспоненциальной задержкой. |
| 11 | OUT_OF_RANGE | 400 Bad Request | Операция была предпринята за пределами допустимого диапазона, например, поиск или чтение за пределами конца файла. В отличие от INVALID_ARGUMENT , эта ошибка указывает на проблему, которую можно исправить, изменив состояние системы. | Не повторяйте попытку, пока не устраните проблему. |
| 12 | UNIMPLEMENTED | 501 Not Implemented | Данная операция не реализована или не поддерживается/не включена в API Google Drive. | Повторять попытку не нужно. |
| 13 | INTERNAL | 500 Internal Server Error | Внутренние ошибки. Это указывает на то, что в процессе обработки в базовой системе была обнаружена непредвиденная ошибка. | Повторите попытку с экспоненциальной задержкой. |
| 14 | UNAVAILABLE | 503 Service Unavailable | API Google Drive недоступен. Скорее всего, это временное состояние, которое можно исправить, повторив операцию с экспоненциальной задержкой. Обратите внимание, что повторная попытка выполнения неидемпотентных операций не всегда безопасна. | Повторите попытку с экспоненциальной задержкой. |
| 15 | DATA_LOSS | 500 Internal Server Error | Невосстановимая потеря или повреждение данных. | Обратитесь к системному администратору. В случае потери или повреждения данных системный администратор может обратиться к представителю службы поддержки. |
| 16 | UNAUTHENTICATED | 401 Unauthorized | Запрос не содержит действительных учетных данных для аутентификации при выполнении операции. | Не повторяйте попытку, пока не устраните проблему. |