Uma operação de longa duração (LRO) é um método de API que leva mais tempo para ser concluído do que o adequado para uma resposta da API. Normalmente, não é recomendável manter a thread de chamada aberta enquanto a tarefa é executada, porque isso oferece uma experiência ruim para o usuário. Em vez disso, é melhor retornar algum tipo de promessa ao usuário e permitir que ele verifique mais tarde.
A API Google Drive retorna uma LRO sempre que você chama o método download
no recurso
files
para fazer o download do conteúdo de um arquivo
pela API Drive ou pelas bibliotecas
de cliente.
O método retorna um recurso operations
ao cliente. Use o recurso operations
para recuperar de forma assíncrona o
status do método da API pesquisando a operação com o método get
. As LROs na API Drive seguem o padrão de design de LRO do Google Cloud.
Para mais informações, consulte Operações de longa duração.
Visão geral do processo
O diagrama a seguir mostra as etapas de alto nível de como o método file.download
funciona.
Chamada
files.download
: quando o app chama o métododownload
, ele inicia a solicitação de download da API Drive para o arquivo. Para mais informações, consulte Fazer o download de arquivos.Solicitar permissões: a solicitação envia credenciais de autenticação para a API Drive. Se o app exigir a chamada da API Drive usando a autenticação de um usuário que ainda não foi concedida, ele vai pedir que o usuário faça login. Seu app também pede acesso com escopos especificados ao configurar a autenticação.
Iniciar o download: uma solicitação da API Drive é feita para iniciar o download do arquivo. A solicitação pode ser feita ao Google Vids ou a outro conteúdo do Google Workspace.
Iniciar LRO: uma operação de longa duração é iniciada e gerencia o processo de download.
Retornar operação pendente: a API Drive retorna uma operação pendente com informações sobre o usuário que está fazendo a solicitação e vários campos de metadados de arquivos.
Estado pendente inicial: seu app recebe a operação pendente junto com um estado pendente inicial de
done=null
. Isso indica que o arquivo ainda não está pronto para download e que o status da operação está pendente.Chame
operations.get
e verifique o resultado: seu app chamaget
nos intervalos recomendados para pesquisar o resultado da operação e receber o estado mais recente de uma operação de longa duração. Se o estado pendente dedone=false
for retornado, seu app precisará continuar pesquisando até que a operação retorne o estado concluído (done=true
). Para arquivos grandes, espere pesquisar várias vezes. Para mais informações, consulte Receber detalhes sobre uma operação de longa duração.Verificar estado pendente: se o estado pendente de
done=true
for retornado da LRO, isso indica que o arquivo está pronto para download e que o status da operação está concluído.Retornar a operação concluída com o URI de download: quando a LRO for concluída, a API Drive vai retornar o URI de download, e o arquivo estará disponível para o usuário.
Fazer o download de arquivos
Para baixar conteúdo em uma operação de longa duração, use o método download
no recurso
files
. O método usa os parâmetros de consulta file_id
, mime_type
e revision_id
:
Obrigatório. O parâmetro de consulta
file_id
é o ID do arquivo a ser baixado.Opcional. O parâmetro de consulta
mime_type
indica o tipo MIME que o método deve usar. Ele só está disponível ao fazer o download de conteúdo de mídia não blob, como documentos do Google Workspace. Para uma lista completa de tipos MIME compatíveis, consulte Tipos MIME de exportação para documentos do Google Workspace.Se o tipo MIME não estiver definido, o documento do Google Workspace será baixado com um tipo MIME padrão. Para mais informações, consulte Tipos MIME padrão.
Opcional. O parâmetro de consulta
revision_id
é o ID da revisão do arquivo a ser baixado. Ele só está disponível ao baixar arquivos blob, Documentos e Planilhas Google. Retorna o código de erroINVALID_ARGUMENT
ao fazer o download de uma revisão específica em arquivos não compatíveis.
O método download
é a única maneira de baixar arquivos do Vids em formato MP4 e geralmente é mais adequado para baixar a maioria dos arquivos de vídeo.
Os links de download gerados inicialmente para os apps Documentos ou Planilhas Google retornam um redirecionamento. Clique no novo link para fazer o download do arquivo.
Uma solicitação ao método download
que inicia a LRO e a solicitação para buscar o URI de download final precisam usar chaves de recurso. Para mais informações, consulte
Acessar arquivos do Drive compartilhados por link usando chaves de recursos.
O protocolo de solicitação é mostrado aqui.
POST https://www.googleapis.com/drive/v3/files/{FILE_ID
}/download
Substitua FILE_ID pelo fileId
do arquivo que você quer
baixar.
Tipos MIME padrão
Se um tipo MIME não for definido ao baixar conteúdo que não seja um blob, os seguintes tipos MIME padrão serão atribuídos:
Tipo de documento | Formato | Tipo MIME | Extensão de arquivo |
---|---|---|---|
Google Apps Script | JSON | application/vnd.google-apps.script+json | .json |
Documentos Google | Microsoft Word | application/vnd.openxmlformats-officedocument.wordprocessingml.document | .docx |
Desenhos Google | PNG | image/png | .png |
Formulários Google | CEP | application/zip | .zip |
Planilhas Google | Microsoft Excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | .xlsx |
Google Sites | Texto simples | text/raw | .txt |
Apresentações Google | Microsoft PowerPoint | application/vnd.openxmlformats-officedocument.presentationml.presentation | .pptx |
Google Vids | MP4 | application/mp4 | .mp4 |
Jamboard | application/pdf |
Resposta do download
Ao chamar o método download
, o corpo da resposta consiste em um recurso que representa uma operação de longa duração. Normalmente, o método retorna um
link para fazer o download do conteúdo do arquivo.
{
"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
}
}
Esta saída inclui os seguintes valores:
RESOURCE_KEY: uma chave de recurso ajuda a proteger seu arquivo contra acesso não intencional. Para mais informações, consulte Acessar arquivos do Drive compartilhados por link usando chaves de recurso.
NAME: o nome atribuído pelo servidor.
DOWNLOAD_URI: o URI de download final do arquivo.
O campo partialDownloadAllowed
indica se um download parcial é permitido. Verdadeiro ao
fazer o download do conteúdo do arquivo blob.
Acessar os detalhes de uma operação de longa duração
Operações de longa duração são chamadas de método que podem levar um tempo considerável para serem concluídas. Normalmente, as operações de download recém-criadas são retornadas inicialmente em um estado pendente (done=null
), principalmente para arquivos do Vids.
É possível usar o recurso operations
fornecido pela
API Drive para verificar o status da LRO de processamento
incluindo o nome exclusivo atribuído pelo servidor.
O método get
recebe de forma assíncrona o estado mais recente de uma operação de longa duração. Os clientes podem usar esse método para pesquisar o resultado da operação em intervalos, conforme recomendado pelo serviço da API.
Pesquisar uma operação de longa duração
Para pesquisar uma LRO disponível, chame repetidamente o método
get
até que a operação seja concluída.
Use uma espera exponencial entre cada
solicitação de pesquisa, como 10 segundos.
Uma LRO fica disponível por um mínimo de 12 horas, mas em alguns casos pode persistir por mais tempo. Essa duração está sujeita a mudanças e pode variar entre os tipos de arquivo. Quando o recurso expira, é necessário fazer uma nova solicitação de método download
.
Todas as solicitações para get
precisam usar chaves de recursos. Para mais informações, consulte
Acessar arquivos do Drive compartilhados por link usando chaves de recursos.
Os protocolos de solicitação são mostrados aqui.
Chamada de método
operations.get(name='NAME');
Substitua NAME pelo nome atribuído pelo servidor à operação, conforme
mostrado na resposta à solicitação do método download
.
curl
curl -i -H \
'Authorization: Bearer $(gcloud auth print-access-token)" \
'https://googleapis.com/drive/v3/operations/NAME?alt=json'
Substitua NAME pelo nome atribuído pelo servidor à operação, conforme
mostrado na resposta à solicitação do método download
.
O comando usa o caminho /drive/v3/operations/NAME
.
O name
só é retornado na resposta a uma solicitação download
.
Não há outra maneira de recuperar o ID, já que a API Drive não é compatível com o método
List
. Se o valor de name
for perdido, gere uma nova resposta chamando a solicitação do método download
novamente.
A resposta de uma solicitação get
consiste em um recurso que representa uma operação de longa duração. Para mais informações, consulte Fazer o download da resposta.
Quando a resposta contém um estado concluído (done=true
), a operação de longa duração terminou.
Baixar uma revisão
Use o valor do campo headRevisionId
do recurso files
para baixar a revisão mais recente. Isso busca
a revisão que corresponde aos metadados do arquivo que você recuperou
anteriormente. Para baixar os dados de todas as revisões anteriores do arquivo que ainda estão armazenadas na nuvem, chame o método list
no recurso revisions
com o parâmetro fileId
. Isso retorna
todos os revisionIds
no arquivo.
Para fazer o download do conteúdo de revisão de arquivos blob, chame o método get
no recurso revisions
com o ID do arquivo a ser baixado, o ID da revisão e o parâmetro de URL alt=media
. O parâmetro de URL
alt=media
informa ao servidor que um download de conteúdo está sendo
solicitado como um formato de resposta alternativo.
Não é possível baixar revisões dos apps Documentos, Planilhas, Apresentações e Vids usando o método get
com o URL alt=media
. Caso contrário, ele vai gerar um erro fileNotDownloadable
.
O parâmetro de URL alt=media
é um parâmetro
de sistema disponível
em todas as APIs REST do Google. Se você usa uma biblioteca de cliente para a
API Drive, não precisa definir esse parâmetro explicitamente.
O protocolo de solicitação é mostrado aqui.
GET https://www.googleapis.com/drive/v3/files/{FILE_ID
}/revisions/{REVISION_ID
}?alt=media
Substitua:
- FILE_ID: o
fileId
do arquivo que você quer baixar. - REVISION_ID: o
revisionId
da revisão que você quer baixar.
As revisões dos apps Documentos, Desenhos e Apresentações Google incrementam automaticamente os números de revisão. No entanto, a série de números pode ter lacunas se as revisões forem excluídas. Portanto, não confie em números sequenciais para recuperar revisões.
Resolver problemas de LROs
Quando uma LRO falha, a resposta inclui um código de erro canônico do Google Cloud.
A tabela a seguir explica a causa de cada código e dá uma recomendação de como lidar com ele. Para muitos erros, a ação recomendada é tentar a solicitação novamente usando a espera exponencial.
É possível ler mais sobre esse modelo de erro e como trabalhar com ele no Guia de projeto da API.
Código | Enumeração | Descrição | Ação recomendada |
---|---|---|---|
1 | CANCELLED |
A operação foi cancelada, geralmente pelo autor da chamada. | Execute a operação novamente. |
2 | UNKNOWN |
Esse erro pode ser retornado quando um valor Status recebido de outro espaço de endereço pertence a um espaço de erro desconhecido nesse espaço de endereço. Se o erro da API não retornar informações suficientes, ele poderá ser convertido neste erro. |
Tentar novamente com a espera exponencial. |
3 | INVALID_ARGUMENT |
O cliente especificou um argumento inválido. Esse erro é diferente de FAILED_PRECONDITION . INVALID_ARGUMENT indica argumentos problemáticos, independentemente do estado do sistema, como um nome de arquivo incorreto. |
Não tente novamente sem resolver o problema. |
4 | DEADLINE_EXCEEDED |
O prazo expirou antes do término da operação. Para operações que mudam o estado do sistema, esse erro pode ser retornado mesmo que a operação tenha sido concluída com sucesso. Por exemplo, uma resposta bem-sucedida de um servidor pode ter atrasado tempo suficiente para que o prazo expirasse. | Tentar novamente com a espera exponencial. |
5 | NOT_FOUND |
Alguma entidade solicitada, como um recurso FHIR, não foi encontrada. | Não tente novamente sem resolver o problema. |
6 | ALREADY_EXISTS |
A entidade que um cliente tentou criar já existe, como uma instância DICOM. | Não tente novamente sem resolver o problema. |
7 | PERMISSION_DENIED |
O autor da chamada não tem permissão para executar a operação especificada. Esse código de erro não indica que a solicitação seja válida, que a entidade solicitada exista ou que ela satisfaça outras condições prévias. | Não tente novamente sem resolver o problema. |
8 | RESOURCE_EXHAUSTED |
Algum recurso foi esgotado, como uma cota por projeto. | Tentar novamente com a espera exponencial. A cota pode ficar disponível com o tempo. |
9 | FAILED_PRECONDITION |
A operação foi rejeitada porque o estado do sistema não é o necessário para a execução dela. Por exemplo, o diretório a ser excluído não está vazio ou uma operação rmdir foi aplicada a um elemento que não é um diretório. |
Não tente novamente sem resolver o problema. |
10 | ABORTED |
A operação foi cancelada, normalmente devido a um problema de simultaneidade, como falha na verificação do sequenciador ou cancelamento da transação. | Tentar novamente com a espera exponencial. |
11 | OUT_OF_RANGE |
Houve uma tentativa da operação depois do intervalo válido, como a busca ou a leitura após o fim do arquivo. Diferentemente de INVALID_ARGUMENT , este erro indica um problema que poderá ser corrigido se o estado do sistema mudar. |
Não tente novamente sem resolver o problema. |
12 | UNIMPLEMENTED |
A operação não foi implementada ou não é compatível nem está ativada na API Drive. | Não repita. |
13 | INTERNAL |
Erros internos. Isso indica que foi encontrado um erro inesperado no processamento do sistema de base. | Tentar novamente com a espera exponencial. |
14 | UNAVAILABLE |
A API Drive não está disponível. Muito provavelmente, trata-se de uma condição temporária, que pode ser corrigida ao tentar novamente com uma espera exponencial. Nem sempre é seguro repetir operações não idempotentes. | Tentar novamente com a espera exponencial. |
15 | DATA_LOSS |
Perda ou corrupção irrecuperável de dados. | Entre em contato com seu administrador de sistemas. O administrador do sistema pode entrar em contato com um representante de suporte se houver perda ou corrupção de dados. |
16 | UNAUTHENTICATED |
A solicitação não tem credenciais válidas de autenticação para a operação. | Não tente novamente sem resolver o problema. |