Uma operação de longa duração (LRO, na sigla em inglês) é um método de API que leva mais tempo para ser concluído do que o adequado para uma resposta de API. Normalmente, não é recomendável manter a linha de execução de chamada aberta enquanto a tarefa é executada, porque isso oferece uma experiência ruim ao 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 download método no
files recurso para fazer o download do conteúdo de um arquivo
pela API Drive ou pelas bibliotecas de
cliente.
O método retorna um operations recurso para
o cliente. É possível usar o recurso operations para recuperar de forma assíncrona o
status do método de API pesquisando a operação pelo 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 gerais de como o método file.download funciona.
Chamar
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 uma autenticação de usuário que ainda não foi concedida, ele vai pedir que o usuário faça login. O app também pede acesso com escopos especificados ao configurar a autenticação.
Iniciar o download: uma solicitação de API Drive é feita para iniciar o download do arquivo. A solicitação pode ser feita para o Google Vids ou algum outro conteúdo do Google Workspace.
Iniciar a LRO: uma operação de longa duração começa e gerencia o processo de download
Retornar operação pendente: a API Drive retorna uma operação pendente que contém informações sobre o usuário que está fazendo a solicitação e vários campos de metadados de arquivos.
Estado pendente inicial: o app recebe a operação pendente 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.Chamar
operations.gete verificar o resultado: o app chama ogetnos 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=falsefor retornado, o 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 Acessar os detalhes de uma operação de longa duração.Verificar o estado pendente: se o estado pendente de
done=truefor retornado da LRO, isso indica que o arquivo está pronto para download e que o status da operação está concluído.Retornar operação concluída com URI de download: quando a LRO é concluída, a API Drive retorna o URI de download e o arquivo fica disponível para o usuário.
Fazer o download de arquivos
Para fazer o download de conteúdo em uma operação de longa duração, use o download método no
files recurso. O método usa os parâmetros file_id, mime_type e revision_id:
Obrigatório. O parâmetro de caminho
file_idé o ID do arquivo do qual será feito o download.Opcional. O parâmetro de consulta
mime_typeindica 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 dos 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 do qual será feito o download. Ele só está disponível ao fazer o download de arquivos blob, Google Docs e Planilhas Google. Retorna o código de erroINVALID_ARGUMENTao fazer o download de uma revisão específica em arquivos não compatíveis.
O método download é a única maneira de fazer o download de arquivos do Vids no formato MP4 e geralmente é mais adequado para fazer o download da maioria dos arquivos de vídeo. Se você tentar exportar arquivos do Google Vids, vai receber um
fileNotExportable erro.
Os links de download gerados para o Google Docs ou Planilhas inicialmente retornam um redirecionamento. Clique no novo link para fazer o download do arquivo.
Uma solicitação para o método download que inicia a LRO e a solicitação para buscar o URI de download final precisam usar chaves de recursos. 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}/downloadSubstitua FILE_ID pelo fileId do arquivo que você quer
baixar.
Tipos MIME padrão
Se um tipo MIME não estiver definido ao fazer o download de conteúdo não 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 |
| Google Docs | Microsoft Word | application/vnd.openxmlformats-officedocument.wordprocessingml.document | .docx |
| Desenhos Google | PNG | image/png | .png |
| Formulários Google | ZIP | application/zip | .zip |
| Planilhas Google | Microsoft Excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | .xlsx |
| Google Sites | Texto bruto | text/raw | .txt |
| Google Slides | Microsoft PowerPoint | application/vnd.openxmlformats-officedocument.presentationml.presentation | .pptx |
| Google Vids | MP4 | video/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. O método normalmente 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 o arquivo contra acesso não intencional. Para mais informações, consulte Acessar arquivos do Drive compartilhados por link usando chaves de recursos.
NAME: o nome atribuído pelo servidor.
DOWNLOAD_URI: o URI de download final do arquivo.
Observe que o campo partialDownloadAllowed indica se um download parcial é permitido e é true
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 demorar para serem concluídas. Normalmente, as operações de download recém-criadas são retornadas inicialmente em um estado pendente (done=null), especialmente para arquivos do Vids.
É possível usar o operations recurso que
a API Drive fornece para verificar o status da LRO de processamento, incluindo o nome exclusivo atribuído pelo servidor.
O método get recebe o estado mais recente de uma
operação de longa duração de forma assíncrona. Os clientes usam este 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
get método até que a operação seja concluída.
Use uma espera exponencial entre cada
solicitação de pesquisa. Por exemplo, pesquise a cada 10 segundos.
Uma LRO permanece 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 ser diferente entre os tipos de arquivo. Quando o recurso expira, uma nova solicitação de método download é necessária.
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 da 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 da 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 de download.
Não há outra maneira de recuperá-lo, já que a API Drive não oferece suporte ao método list. Se o valor name for perdido, será necessário gerar 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 Resposta
do download.
Quando a resposta contém um estado concluído (done=true), a operação de longa duração terminou.
Fazer o download de uma revisão
É possível usar o valor do
headRevisionId campo
do recurso files para fazer o download da revisão
mais recente. Isso busca a revisão que corresponde aos metadados do arquivo recuperado anteriormente. Para fazer o download dos dados de todas as revisões anteriores do
arquivo que ainda estão armazenadas na nuvem, chame o list método no recurso revisions com o parâmetro fileId. Isso retorna todos os revisionIds no arquivo.
Para fazer o download do conteúdo da revisão de arquivos blob, é necessário chamar o get método no
revisions recurso com o ID do arquivo a ser
baixado, o ID da revisão e o alt parâmetro do
sistema.
O parâmetro alt=media informa ao servidor que um download de conteúdo está sendo solicitado como um formato de resposta alternativo.
O parâmetro do sistema alt está disponível em todas as APIs REST do Google. Se você usar uma biblioteca de cliente para a API Drive, não será necessário definir esse parâmetro explicitamente.
As revisões do Google Docs, Planilhas, Slides e Vids não podem ser baixadas usando o método get com o parâmetro alt=media. Caso contrário, ele gera um fileNotDownloadable erro.
O protocolo de solicitação é mostrado aqui.
GET https://www.googleapis.com/drive/v3/files/{FILE_ID}/revisions/{REVISION_ID}?alt=mediaSubstitua:
- FILE_ID: o
fileIddo arquivo que você quer baixar. - REVISION_ID: o
revisionIdda revisão que você quer baixar.
As revisões do Google Docs, Desenhos e Slides 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 com LROs
Quando uma LRO falha, a resposta inclui um código de erro canônico do Google Cloud.
A tabela a seguir mostra cada código de erro, o código de status HTTP mapeado, uma descrição e uma recomendação de como lidar com o código de erro. Para muitos erros, a ação recomendada é tentar a solicitação novamente usando espera exponencial.
É possível ler mais sobre esse modelo de erro e como trabalhar com ele no Guia de design de API.
| Código | Enumeração | Código de status HTTP | Descrição | Ação recomendada |
|---|---|---|---|---|
| 1 | CANCELLED |
499 Client Closed Request |
A operação foi cancelada, geralmente pelo autor da chamada. | Execute a operação novamente. |
| 2 | UNKNOWN |
500 Internal Server Error |
Esse erro pode ser retornado quando um valor de 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, o erro poderá ser convertido neste erro. |
Tentar novamente com a espera exponencial. |
| 3 | INVALID_ARGUMENT |
400 Bad Request |
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 |
504 Gateway Timeout |
O prazo expirou antes do término da operação. Para operações que alteram 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 |
404 Not Found |
Algumas entidades solicitadas, como um recurso FHIR, não foram encontradas. | Não tente novamente sem resolver o problema. |
| 6 | ALREADY_EXISTS |
409 Conflict |
A entidade que um cliente tentou criar, como uma instância DICOM, já existe. | Não tente novamente sem resolver o problema. |
| 7 | PERMISSION_DENIED |
403 Forbidden |
O autor da chamada não tem permissão para executar a operação especificada. Esse código do erro não indica que a solicitação seja válida, que a entidade solicitada exista ou que satisfaça outras condições prévias. | Não tente novamente sem resolver o problema. |
| 8 | RESOURCE_EXHAUSTED |
429 Too Many Requests |
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 |
400 Bad Request |
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 |
409 Conflict |
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 |
400 Bad Request |
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 |
501 Not Implemented |
A operação não foi implementada ou não é compatível nem está ativada na API Drive. | Não tente novamente. |
| 13 | INTERNAL |
500 Internal Server Error |
Erros internos. Isso indica que foi encontrado um erro inesperado no processamento do sistema de base. | Tentar novamente com a espera exponencial. |
| 14 | UNAVAILABLE |
503 Service 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 |
500 Internal Server Error |
Perda de dados ou corrupção irrecuperável. | Entre em contato com seu administrador de sistemas. O administrador do sistema pode entrar em contato com um representante de suporte se ocorrer perda ou corrupção de dados. |
| 16 | UNAUTHENTICATED |
401 Unauthorized |
A solicitação não tem credenciais válidas de autenticação para a operação. | Não tente novamente sem resolver o problema. |