Длительная операция (LRO) — это метод API, выполнение которого занимает больше времени, чем это допустимо для ответа API. Как правило, нежелательно удерживать вызывающий поток открытым во время выполнения задачи, поскольку это ухудшает пользовательский опыт. Вместо этого лучше вернуть пользователю какое-либо обещание и позволить ему проверить результат позже.
The Google Drive API returns a LRO every time you call the download method on the files resource to download the content of a file either through the Drive API or its client libraries .
Этот метод возвращает клиенту ресурс operations . Вы можете использовать ресурс operations для асинхронного получения статуса метода API, опрашивая операцию через метод get . LRO в Drive API соответствуют шаблону проектирования LRO от Google Cloud .
For more information, see Long-running operations .
Обзор процесса
The following diagram shows the high-level steps of how the file.download method works.
Call
files.download: When your app calls thedownloadmethod, it launches the Drive API download request for the file. For more information, see Download files .Запрос разрешений : Запрос отправляет учетные данные для аутентификации в API Google Диска. Если вашему приложению требуется вызов API Google Диска с использованием аутентификации пользователя, которая еще не предоставлена, оно запрашивает у пользователя вход в систему. Ваше приложение также запрашивает доступ с областями действия , которые вы указываете при настройке аутентификации.
Start download : A Drive API request is made to start the file download. The request could be made to Google Vids or some other Google Workspace content.
Start LRO : A long-running operation begins and it manages the download process.
Return pending operation : The Drive API returns a pending operation containing information about the user making the request and several file metadata fields.
Начальное состояние ожидания : Ваше приложение получает сообщение об ожидающей операции вместе с начальным состоянием ожидания
done=null. Это означает, что файл еще не готов к загрузке и что статус операции — ожидание.Вызовите
operations.getи проверьте результат : ваше приложение вызывает методgetс рекомендуемыми интервалами для опроса результата операции и получения последнего состояния длительной операции. Если возвращается состояние ожиданияdone=false, ваше приложение должно продолжать опрос до тех пор, пока операция не вернет состояние завершения (done=true). Для больших файлов ожидайте многократных опросов. Для получения дополнительной информации см. раздел «Получение подробной информации о длительной операции» .Check pending state : If the pending state of
done=trueis returned from the LRO, this denotes the file is ready for download and that the operation status is complete.Return completed operation with download URI : Once the LRO is done, the Drive API returns the download URI and the file is now available to the user.
Скачать файлы
To download content under a long-running operation, use the download method on the files resource. The method takes the parameters of file_id , mime_type , and revision_id :
Required. The
file_idpath parameter is the ID of the file to download.Необязательный параметр. Параметр запроса
mime_typeуказывает тип MIME, который должен использоваться методом. Он доступен только при загрузке медиаконтента, не являющегося BLOB-объектом (например, документов Google Workspace). Полный список поддерживаемых типов MIME см. в разделе «Экспорт типов MIME для документов Google Workspace» .If the MIME type isn't set, the Google Workspace document is downloaded with a default MIME type. For more information, see Default MIME types .
Необязательный параметр. Параметр запроса
revision_id— это идентификатор ревизии загружаемого файла. Он доступен только при загрузке файлов BLOB, документов Google Docs и таблиц Google Sheets. Возвращает код ошибкиINVALID_ARGUMENTпри загрузке определенной ревизии для неподдерживаемых файлов.
Метод download — единственный способ скачать видеофайлы в формате MP4, и он, как правило, лучше всего подходит для загрузки большинства видеофайлов. При попытке экспорта файлов Google Vids вы получите ошибку fileNotExportable .
Download links generated for Google Docs or Sheets initially return a redirect. Click the new link to download the file.
Запрос к методу download запускающему LRO, и запрос на получение конечного URI загрузки должны использовать ключи ресурсов. Дополнительную информацию см. в разделе «Доступ к файлам Google Диска, доступным по ссылкам, с помощью ключей ресурсов» .
Здесь представлен протокол запроса.
POST https://www.googleapis.com/drive/v3/files/{FILE_ID}/download Replace FILE_ID with the fileId of the file that you want to download.
Типы 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 : A resource key helps protect your file from unintended access. For more information, see Access link-shared Drive files using resource keys .
NAME : Имя, присвоенное сервером.
DOWNLOAD_URI : Конечный URI для загрузки файла.
Note that the partialDownloadAllowed field denotes if a partial download is permitted and is true when downloading blob file content.
Узнайте подробности о давно работающей операции.
Длительные операции — это вызовы методов, выполнение которых может занять значительное количество времени. Как правило, вновь созданные операции загрузки изначально возвращаются в состоянии ожидания ( done=null ), особенно это касается видеофайлов.
Вы можете использовать ресурс operations , предоставляемый API Drive, чтобы проверить статус обработки LRO, указав уникальное имя, присвоенное сервером.
The get method gets the latest state of a long-running operation asynchronously. Clients can use this method to poll the operation result at intervals as recommended by the API service.
Опрос – это давно существующая операция.
Для опроса доступного 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 . Параметр alt=media сообщает серверу, что запрашивается загрузка содержимого в альтернативном формате ответа.
Системный параметр alt доступен для всех REST API Google. Если вы используете клиентскую библиотеку для API Google Drive, вам не нужно явно указывать этот параметр.
С помощью метода get с параметром alt=media невозможно загрузить отредактированные версии документов Google Docs, Sheets, Slides и видеороликов. В противном случае возникнет ошибка fileNotDownloadable .
Здесь представлен протокол запроса.
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 | Запрос не содержит действительных учетных данных для аутентификации при выполнении операции. | Не повторяйте попытку, пока не устраните проблему. |