Una operación de larga duración (LRO) es un método de API que tarda más tiempo en completarse que lo apropiado para una respuesta de API. Por lo general, no es conveniente mantener el subproceso de llamada abierto mientras se ejecuta la tarea, ya que ofrece una experiencia del usuario deficiente. En su lugar, es mejor mostrarle al usuario algún tipo de promesa y permitirle que vuelva a consultar más tarde.
La API de Google Drive muestra una LRO cada vez que llamas al método download()
en el recurso files
para descargar el contenido de un archivo, ya sea a través de la API de Drive o de sus bibliotecas cliente.
El método muestra un recurso operations
al cliente. Puedes usar el recurso operations
para recuperar de forma asíncrona el estado del método de la API sondeando la operación a través del método get()
. Las LRO en la API de Drive se adhieren al patrón de diseño de LRO de Google Cloud.
Para obtener más información, consulta Operaciones de larga duración.
Descripción general del proceso
En el siguiente diagrama, se muestran los pasos de alto nivel del funcionamiento del método file.download
.
Llama a
files.download
: Cuando tu app llama al métododownload()
, inicia la solicitud de descarga de la API de Drive para el archivo. Para obtener más información, consulta Cómo descargar archivos.Solicita permisos: La solicitud envía credenciales de autenticación a la API de Drive. Si tu app requiere llamar a la API de Drive con la autenticación de un usuario que aún no se otorgó, le solicita al usuario que acceda. Tu app también solicita acceso con los alcances que especificas cuando configuras la autenticación.
Iniciar descarga: Se realiza una solicitud a la API de Drive para iniciar la descarga del archivo. La solicitud se puede realizar a Google Vids o a algún otro contenido de Google Workspace.
Iniciar LRO: Comienza una operación de larga duración que administra el proceso de descarga.
Devuelve una operación pendiente: La API de Drive muestra una operación pendiente que contiene información sobre el usuario que realiza la solicitud y varios campos de metadatos de archivos.
Estado pendiente inicial: Tu app recibe la operación pendiente junto con un estado pendiente inicial de
done=null
. Esto indica que el archivo aún no está listo para descargarse y que el estado de la operación está pendiente.Llama a
operations.get
y verifica el resultado: Tu app llama aget()
en los intervalos recomendados para sondear el resultado de la operación y obtener el estado más reciente de una operación de larga duración. Si se muestra el estado pendiente dedone=false
, tu app debe seguir sondeando hasta que la operación muestre el estado completado (done=true
). En el caso de los archivos grandes, espera sondear varias veces. Para obtener más información, consulta Obtén los detalles de una operación de larga duración.Verifica el estado pendiente: Si se muestra el estado pendiente de
done=true
desde la LRO, significa que el archivo está listo para descargarse y que el estado de la operación está completo.Devuelve la operación completada con el URI de descarga: Una vez que se completa la LRO, la API de Drive muestra el URI de descarga y el archivo ahora está disponible para el usuario.
Descarga los archivos correspondientes
Para descargar contenido en una operación de larga duración, usa el método download()
en el recurso files
. El método toma los
parámetros de consulta de file_id
, mime_type
y revision_id
:
Obligatorio. El parámetro de consulta
file_id
es el ID del archivo que se descargará.Opcional. El parámetro de consulta
mime_type
indica el tipo de MIME que debe usar el método. Solo está disponible cuando se descarga contenido multimedia que no es de blob (como documentos de Google Workspace). Para obtener una lista completa de los tipos de MIME compatibles, consulta Cómo exportar tipos de MIME para documentos de Google Workspace.Si no se establece el tipo MIME, el documento de Google Workspace se descarga con un tipo MIME predeterminado. Para obtener más información, consulta Tipos MIME predeterminadas.
Opcional. El parámetro de consulta
revision_id
es el ID de la revisión del archivo que se descargará. Solo está disponible cuando se descargan archivos blob, Documentos de Google y Hojas de cálculo de Google. Muestra el código de errorINVALID_ARGUMENT
cuando se descarga una revisión específica en archivos no compatibles.
El método download()
es la única forma de descargar archivos de Vids en formato MP4 y, por lo general, es la más adecuada para descargar la mayoría de los archivos de video.
Los vínculos de descarga generados para Documentos o Hojas de cálculo de Google muestran inicialmente un redireccionamiento. Haz clic en el nuevo vínculo para descargar el archivo.
Una solicitud al método download()
que inicia la LRO y la solicitud para recuperar el URI de descarga final deben usar claves de recursos. Para obtener más información, consulta Cómo acceder a archivos de Drive compartidos con un vínculo usando claves de recursos.
Aquí se muestra el protocolo de solicitud.
POST https://www.googleapis.com/drive/v3/files/{FILE_ID
}/download
Reemplaza FILE_ID por el fileId
del archivo que deseas
descargar.
Tipos de MIME predeterminados
Si no se establece un tipo de MIME cuando se descarga contenido que no es de BLOB, se asignan los siguientes tipos de MIME predeterminados:
Tipo de documento | Formato | Tipo de MIME | Extensión de archivo |
---|---|---|---|
Google Apps Script | JSON | application/vnd.google-apps.script+json | .json |
Documentos de Google | Microsoft Word | application/vnd.openxmlformats-officedocument.wordprocessingml.document | .docx |
Dibujos de Google | PNG | image/png | .png |
Formularios de Google | ZIP | application/zip | .zip |
Hojas de cálculo de Google | Microsoft Excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | .xlsx |
Sitios de Google | Texto sin procesar | texto/sin procesar | .txt |
Presentaciones de Google | Microsoft PowerPoint | application/vnd.openxmlformats-officedocument.presentationml.presentation | .pptx |
Google Vids | MP4 | application/mp4 | .mp4 |
Jamboard | application/pdf |
Descarga la respuesta
Cuando llames al método download()
, el cuerpo de la respuesta consistirá en un recurso que representa una operación de larga duración. Por lo general, el método muestra un vínculo para descargar el contenido del archivo.
{
"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
}
}
En esta salida, se incluyen los siguientes valores:
RESOURCE_KEY: Una clave de recurso ayuda a proteger tu archivo del acceso no deseado. Para obtener más información, consulta Cómo acceder a archivos de Drive compartidos con un vínculo usando claves de recursos.
NAME: Es el nombre asignado por el servidor.
DOWNLOAD_URI: Es el URI de descarga final del archivo.
Ten en cuenta que el campo partialDownloadAllowed
indica si se permite una descarga parcial.
Es verdadero cuando se descarga el contenido de un archivo blob.
Obtén los detalles de una operación de larga duración
Las operaciones de larga duración son llamadas a métodos que pueden tardar una gran cantidad de tiempo en completarse. Por lo general, las operaciones de descarga creadas recientemente se muestran inicialmente en un estado pendiente (done=null
), en especial para los archivos de Vids.
Puedes usar el recurso operations
que proporciona la API de Drive para verificar el estado de la LRO de procesamiento. Para ello, incluye el nombre único asignado por el servidor.
El método get()
obtiene el estado más reciente de una operación de larga duración de forma asíncrona. Los clientes pueden usar este método para sondear el resultado de la operación por intervalos según la recomendación del servicio de la API.
Cómo sondear una operación de larga duración
Para sondear una LRO disponible, llama de forma reiterada al método get()
hasta que finalice la operación. Usa una retirada exponencial entre cada solicitud de sondeo, por ejemplo, 10 segundos.
Una LRO permanece disponible durante un mínimo de 12 horas, pero, en algunos casos, puede persistir
más tiempo. Esta duración está sujeta a cambios y puede ser diferente entre los tipos de archivo. Una vez que venza el recurso, se necesitará una nueva solicitud del método download()
.
Todas las solicitudes a get()
deben usar claves de recursos. Para obtener más información, consulta Cómo acceder a archivos de Drive compartidos con un vínculo mediante claves de recursos.
Aquí se muestran los protocolos de solicitud.
Llamada a método
operations.get(name='NAME');
Reemplaza NAME por el nombre asignado por el servidor a la operación, como se muestra en la respuesta a la solicitud del método download()
.
curl
curl -i -H \
'Authorization: Bearer $(gcloud auth print-access-token)" \
'https://googleapis.com/drive/v3/operations/NAME?alt=json'
Reemplaza NAME por el nombre asignado por el servidor a la operación, como se muestra en la respuesta a la solicitud del método download()
.
El comando usa la ruta de acceso /drive/v3/operations/NAME
.
Ten en cuenta que name
solo se muestra en la respuesta a una solicitud download()
.
No hay otra forma de recuperarlo, ya que la API de Drive no admite el método List()
. Si se pierde el valor de name
, debes generar una respuesta nueva llamando nuevamente a la solicitud del método download()
.
La respuesta de una solicitud get()
consiste en un recurso que representa una operación de larga duración. Para obtener más información, consulta Cómo descargar la respuesta.
Cuando la respuesta contiene un estado completado (done=true
), significa que la operación de larga duración finalizó.
Descarga una revisión
Puedes usar el valor del campo headRevisionId
del recurso files
para descargar la revisión más reciente.
Esto recupera la revisión que corresponde a los metadatos del archivo que recuperaste anteriormente. Para descargar los datos de todas las revisiones anteriores del archivo que aún se almacenan en la nube, puedes llamar al método list()
en el recurso revisions
con el parámetro fileId
. Esto muestra todos los revisionIds
del archivo.
Para descargar el contenido de revisión de los archivos blob, debes llamar al método get()
en el recurso revisions
con el ID del archivo que deseas descargar, el ID de la revisión y el parámetro de URL alt=media
.
El parámetro de URL alt=media
le indica al servidor que se está solicitando una descarga de contenido como formato de respuesta alternativo.
Las revisiones de Documentos, Hojas de cálculo, Presentaciones y Vids de Google no se pueden descargar con el método get()
con la URL alt=media
. De lo contrario, genera un error fileNotDownloadable
.
El parámetro de URL alt=media
es un parámetro del sistema disponible en todas las APIs de REST de Google. Si usas una biblioteca cliente para la API de Drive, no necesitas configurar este parámetro de forma explícita.
Aquí se muestra el protocolo de solicitud.
GET https://www.googleapis.com/drive/v3/files/{FILE_ID
}/revisions/{REVISION_ID
}?alt=media
Reemplaza lo siguiente:
- FILE_ID: Es el
fileId
del archivo que deseas descargar. - REVISION_ID: Es el
revisionId
de la revisión que deseas descargar.
Las revisiones de Documentos, Presentaciones y Dibujos de Google incrementan automáticamente los números de revisión. Sin embargo, la serie de números podría tener brechas si se borran las revisiones, por lo que no debes depender de los números secuenciales para recuperarlas.
Soluciona problemas de LRO
Cuando falla una LRO, su respuesta incluye un código de error canónico de Google Cloud.
En la siguiente tabla, se proporciona una explicación de la causa de cada código y una recomendación para manejarlo. Para muchos errores, la acción recomendada es volver a intentar la solicitud con la retirada exponencial.
Puedes obtener más información sobre este modelo de error y cómo trabajar con él en la guía de diseño de API.
Código | Enum | Descripción | Acción recomendada |
---|---|---|---|
1 | CANCELLED |
La operación se canceló (por lo general, la cancela el emisor). | Vuelve a ejecutar la operación. |
2 | UNKNOWN |
Este error puede mostrarse cuando un valor Status recibido de otro espacio de direcciones pertenece a un espacio de error desconocido en este espacio de direcciones. Si el error de la API no muestra suficiente información, es posible que el error se convierta en este. |
Vuelve a intentarlo con una retirada exponencial. |
3 | INVALID_ARGUMENT |
El cliente especificó un argumento no válido. Este error difiere de FAILED_PRECONDITION . INVALID_ARGUMENT indica los argumentos que son problemáticos sin importar el estado del sistema, como un nombre de archivo con formato incorrecto. |
No vuelvas a intentarlo sin solucionar el problema. |
4 | DEADLINE_EXCEEDED |
El plazo venció antes de que la operación se pudiera completar. En el caso de las operaciones que cambian el estado del sistema, es posible que se muestre este error incluso si la operación se completó correctamente. Por ejemplo, una respuesta correcta desde un servidor podría haberse retrasado lo suficiente como para que el plazo venciera. | Vuelve a intentarlo con una retirada exponencial. |
5 | NOT_FOUND |
No se encontró alguna entidad solicitada, como un recurso de FHIR. | No vuelvas a intentarlo sin solucionar el problema. |
6 | ALREADY_EXISTS |
Ya existe la entidad que un cliente intentó crear, como una instancia de DICOM. | No vuelvas a intentarlo sin solucionar el problema. |
7 | PERMISSION_DENIED |
El emisor de la llamada no tiene permiso para ejecutar la operación especificada. Este código de error no sugiere que la solicitud sea válida, que la entidad solicitada exista o que satisfaga otras condiciones previas. | No vuelvas a intentarlo sin solucionar el problema. |
8 | RESOURCE_EXHAUSTED |
Se agotó algún recurso, como una cuota por proyecto. | Vuelve a intentarlo con una retirada exponencial. Es posible que la cuota esté disponible con el tiempo. |
9 | FAILED_PRECONDITION |
La operación se rechazó porque el sistema no se encuentra en un estado necesario para la ejecución de la operación. Por ejemplo, el directorio que se borrará no está vacío, o se aplicará una operación rmdir a un elemento que no es un directorio. |
No vuelvas a intentarlo sin solucionar el problema. |
10 | ABORTED |
La operación se anuló, generalmente debido a un problema de simultaneidad, como una falla en la verificación del secuenciador o la anulación de la transacción. | Vuelve a intentarlo con una retirada exponencial. |
11 | OUT_OF_RANGE |
La operación se intentó más allá del rango válido, como buscar o leer más allá del final del archivo. A diferencia de INVALID_ARGUMENT , este error indica un problema que se puede solucionar si cambia el estado del sistema. |
No vuelvas a intentarlo sin solucionar el problema. |
12 | UNIMPLEMENTED |
La operación no se implementó, no se admite o no está habilitada en la API de Drive. | No volver a intentar. |
13 | INTERNAL |
Errores internos. Esto indica que se produjo un error inesperado en el procesamiento del sistema subyacente. | Vuelve a intentarlo con una retirada exponencial. |
14 | UNAVAILABLE |
La API de Drive no está disponible. Lo más probable es que esta sea una condición transitoria y que se pueda corregir si vuelves a intentarlo con una retirada exponencial. Ten en cuenta que no siempre es seguro reintentar operaciones no idempotentes. | Vuelve a intentarlo con una retirada exponencial. |
15 | DATA_LOSS |
Daño o pérdida de datos no recuperable. | Comunícate con tu administrador del sistema. Si se produjo una pérdida o corrupción de datos, es posible que el administrador del sistema deba comunicarse con un representante de asistencia. |
16 | UNAUTHENTICATED |
La solicitud no tiene credenciales de autenticación válidas para la operación. | No vuelvas a intentarlo sin solucionar el problema. |