Gestione delle operazioni a lunga esecuzione

Un'operazione a lunga esecuzione (LRO) è un metodo API che richiede più tempo per essere completato rispetto a quanto appropriato per una risposta API. In genere, non vuoi mantenere aperto il thread di chiamata mentre l'attività è in esecuzione, in quanto offre un'esperienza utente scadente. È meglio invece restituire all'utente una sorta di promessa e invitarlo a riprovare in un secondo momento.

L'API Google Drive restituisce un'operazione di lunga durata ogni volta che chiami il metodo download sulla risorsa files per scaricare i contenuti di un file tramite l'API Drive o le relative librerie client.

Il metodo restituisce una risorsa operations al client. Puoi utilizzare la risorsa operations per recuperare in modo asincrono lo stato del metodo API eseguendo il polling dell'operazione tramite il metodo get. Le operazioni LRO nell'API Drive rispettano il pattern di progettazione LRO di Google Cloud.

Per saperne di più, consulta Operazioni di lunga durata.

Panoramica sulla procedura

Il seguente diagramma mostra i passaggi di alto livello del funzionamento del metodo file.download.

Passaggi di alto livello per il metodo file.download.
Figura 1. Passaggi di alto livello per il metodo file.download.

  1. Chiamata files.download: quando la tua app chiama il metodo download, avvia la richiesta di download dell'API Drive per il file. Per ulteriori informazioni, vedi Scaricare i file.

  2. Richiedi autorizzazioni: la richiesta invia le credenziali di autenticazione all'API Drive. Se la tua app richiede la chiamata all'API Drive utilizzando l'autenticazione di un utente che non è ancora stata concessa, viene chiesto all'utente di accedere. La tua app chiede anche l'accesso con ambiti che specifichi quando configuri l'autenticazione.

  3. Avvia download: viene inviata una richiesta dell'API Drive per avviare il download del file. La richiesta potrebbe essere rivolta a Google Vids o ad altri contenuti di Google Workspace.

  4. Avvia LRO: inizia un'operazione a lunga esecuzione che gestisce il processo di download.

  5. Restituisci operazione in attesa: l'API Drive restituisce un'operazione in attesa contenente informazioni sull'utente che effettua la richiesta e diversi campi di metadati dei file.

  6. Stato iniziale in attesa: la tua app riceve l'operazione in attesa insieme a uno stato iniziale in attesa di done=null. Ciò indica che il file non è ancora pronto per il download e che lo stato dell'operazione è in attesa.

  7. Chiama operations.get e verifica il risultato: la tua app chiama get agli intervalli consigliati per eseguire il polling del risultato dell'operazione e ottenere l'ultimo stato di un'operazione a lunga esecuzione. Se viene restituito lo stato in attesa di done=false, la tua app deve continuare a eseguire il polling finché l'operazione non restituisce lo stato completato (done=true). Per i file di grandi dimensioni, prevedi di eseguire il polling più volte. Per ulteriori informazioni, vedi Visualizzare i dettagli di un'operazione a lunga esecuzione.

  8. Controlla lo stato in attesa: se viene restituito lo stato in attesa di done=true dall'operazione LRO, significa che il file è pronto per il download e che lo stato dell'operazione è completato.

  9. Restituisci l'operazione completata con l'URI di download: una volta completata l'operazione LRO, l'API Drive restituisce l'URI di download e il file è ora disponibile per l'utente.

Scarica file

Per scaricare i contenuti nell'ambito di un'operazione di lunga durata, utilizza il metodo download nella risorsa files. Il metodo accetta i parametri di ricerca di file_id, mime_type e revision_id:

  • Obbligatorio. Il parametro di query file_id è l'ID del file da scaricare.

  • (Facoltativo) Il parametro di query mime_type indica il tipo MIME che il metodo deve utilizzare. È disponibile solo per il download di contenuti multimediali non blob (come i documenti Google Workspace). Per un elenco completo dei tipi MIME supportati, vedi Tipi MIME di esportazione per i documenti Google Workspace.

    Se il tipo MIME non è impostato, il documento Google Workspace viene scaricato con un tipo MIME predefinito. Per saperne di più, consulta Tipi MIME predefiniti.

  • (Facoltativo) Il parametro di query revision_id è l'ID revisione del file da scaricare. È disponibile solo durante il download di file blob, Documenti Google e Fogli Google. Restituisce il codice di errore INVALID_ARGUMENT durante il download di una revisione specifica su file non supportati.

Il metodo download è l'unico modo per scaricare i file Vids in formato MP4 ed è in genere il più adatto per scaricare la maggior parte dei file video.

I link di download generati inizialmente per Documenti o Fogli Google restituiscono un reindirizzamento. Fai clic sul nuovo link per scaricare il file.

Una richiesta al metodo download che avvia l'operazione LRO e la richiesta per recuperare l'URI di download finale devono utilizzare entrambe le chiavi delle risorse. Per saperne di più, vedi Accedere ai file di Drive condivisi tramite link utilizzando le chiavi delle risorse.

Il protocollo di richiesta è mostrato qui.

POST https://www.googleapis.com/drive/v3/files/{FILE_ID}/download

Sostituisci FILE_ID con il fileId del file che vuoi scaricare.

Tipi MIME predefiniti

Se non viene impostato un tipo MIME durante il download di contenuti non blob, vengono assegnati i seguenti tipi MIME predefiniti:

Tipo di documento Formato tipo MIME Estensione del file
Google Apps Script JSON application/vnd.google-apps.script+json .json
Documenti Google Microsoft Word application/vnd.openxmlformats-officedocument.wordprocessingml.document .docx
Disegni Google PNG. image/png .png
Moduli Google ZIP application/zip .zip
Fogli Google Microsoft Excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .xlsx
Google Sites Testo non elaborato text/raw .txt
Presentazioni Google Microsoft PowerPoint application/vnd.openxmlformats-officedocument.presentationml.presentation .pptx
Google Vids MP4 application/mp4 .mp4
Jamboard PDF application/pdf .pdf

Scarica risposta

Quando chiami il metodo download, il corpo della risposta è costituito da una risorsa che rappresenta un'operazione a lunga esecuzione. Il metodo in genere restituisce un link per scaricare i contenuti del file.

{
  "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
  }
}

Questo output include i seguenti valori:

Tieni presente che il campo partialDownloadAllowed indica se è consentito un download parziale. Vero quando si scaricano i contenuti del file blob.

Visualizzare i dettagli di un'operazione a lunga esecuzione

Le operazioni a lunga esecuzione sono chiamate di metodi che potrebbero richiedere molto tempo per essere completate. In genere, le operazioni di download appena create vengono inizialmente restituite in stato di attesa (done=null), soprattutto per i file Vids.

Puoi utilizzare la risorsa operations fornita dall'API Drive per controllare lo stato dell'operazione LRO di elaborazione includendo il nome univoco assegnato dal server.

Il metodo get recupera in modo asincrono lo stato più recente di un'operazione a lunga esecuzione. I client possono utilizzare questo metodo per eseguire il polling del risultato dell'operazione a intervalli come consigliato dal servizio API.

Eseguire il polling di un'operazione a lunga esecuzione

Per eseguire il polling di un'operazione LRO disponibile, chiama ripetutamente il metodo get finché l'operazione non viene completata. Utilizza un backoff esponenziale tra ogni richiesta di polling, ad esempio 10 secondi.

Un LRO rimane disponibile per un minimo di 12 ore, ma in alcuni casi può persistere più a lungo. Questa durata è soggetta a modifiche e può variare a seconda del tipo di file. Una volta scaduta la risorsa, è necessaria una nuova richiesta di metodo download.

Tutte le richieste a get devono utilizzare le chiavi delle risorse. Per saperne di più, vedi Accedere ai file di Drive condivisi tramite link utilizzando le chiavi delle risorse.

I protocolli di richiesta vengono mostrati qui.

Chiamata al metodo

operations.get(name='NAME');

Sostituisci NAME con il nome assegnato dal server all'operazione, come mostrato nella risposta alla richiesta del metodo download.

curl

curl -i -H \
      'Authorization: Bearer $(gcloud auth print-access-token)" \
      'https://googleapis.com/drive/v3/operations/NAME?alt=json'

Sostituisci NAME con il nome assegnato dal server all'operazione, come mostrato nella risposta alla richiesta del metodo download.

Il comando utilizza il percorso /drive/v3/operations/NAME.

Tieni presente che name viene restituito solo nella risposta a una richiesta download. Non esiste un altro modo per recuperarlo, in quanto l'API Drive non supporta il metodo List. Se il valore name viene perso, devi generare una nuova risposta chiamando di nuovo la richiesta del metodo download.

La risposta a una richiesta get è costituita da una risorsa che rappresenta un'operazione a lunga esecuzione. Per maggiori informazioni, vedi Scaricare la risposta.

Quando la risposta contiene uno stato completato (done=true), l'operazione a lunga esecuzione è terminata.

Scaricare una revisione

Puoi utilizzare il valore del campo headRevisionId della risorsa files per scaricare l'ultima revisione. Viene recuperata la revisione corrispondente ai metadati del file recuperato in precedenza. Per scaricare i dati di tutte le revisioni precedenti del file ancora archiviate nel cloud, puoi chiamare il metodo list sulla risorsa revisions con il parametro fileId. Vengono restituiti tutti i revisionIds nel file.

Per scaricare i contenuti della revisione dei file blob, devi chiamare il metodo get sulla risorsa revisions con l'ID del file da scaricare, l'ID della revisione e il parametro URL alt=media. Il parametro alt=media URL indica al server che il download dei contenuti viene richiesto come formato di risposta alternativo.

Le revisioni di Documenti, Fogli, Presentazioni e Vids non possono essere scaricate utilizzando il metodo get con l'URL alt=media . In caso contrario, genera un errore fileNotDownloadable.

Il parametro URL alt=media è un parametro di sistema disponibile in tutte le API REST di Google. Se utilizzi una libreria client per l'API Drive, non è necessario impostare esplicitamente questo parametro.

Il protocollo di richiesta è mostrato qui.

GET https://www.googleapis.com/drive/v3/files/{FILE_ID}/revisions/{REVISION_ID}?alt=media

Sostituisci quanto segue:

  • FILE_ID: Il fileId del file che vuoi scaricare.
  • REVISION_ID: il revisionId della revisione che vuoi scaricare.

Le revisioni di Documenti, Disegni e Presentazioni Google aumentano automaticamente i numeri di revisione. Tuttavia, la serie di numeri potrebbe presentare lacune se le revisioni vengono eliminate, quindi non devi fare affidamento su numeri sequenziali per recuperare le revisioni.

Risolvere i problemi relativi alle operazioni a lunga esecuzione

Quando un'operazione di lunga durata non va a buon fine, la risposta include un codice di errore canonico di Google Cloud.

La tabella seguente fornisce una spiegazione della causa di ogni codice e un consiglio su come gestirlo. Per molti errori, l'azione consigliata è riprovare a inviare la richiesta utilizzando il backoff esponenziale.

Puoi leggere ulteriori informazioni su questo modello di errore e su come utilizzarlo nella guida alla progettazione delle API.

Codice Enum Descrizione Azione consigliata
1 CANCELLED L'operazione è stata annullata, in genere dal chiamante. Esegui di nuovo l'operazione.
2 UNKNOWN Questo errore potrebbe essere restituito quando un valore Status ricevuto da un altro spazio di indirizzi appartiene a uno spazio di errori sconosciuto in questo spazio di indirizzi. Se l'errore API non restituisce informazioni sufficienti, potrebbe essere convertito in questo errore. Riprova con il backoff esponenziale.
3 INVALID_ARGUMENT Il client ha specificato un argomento non valido. Questo errore è diverso da FAILED_PRECONDITION. INVALID_ARGUMENT indica argomenti problematici indipendentemente dallo stato del sistema, ad esempio un nome file non valido. Non riprovare senza risolvere il problema.
4 DEADLINE_EXCEEDED La scadenza è terminata prima che l'operazione potesse essere completata. Per le operazioni che modificano lo stato del sistema, questo errore potrebbe essere restituito anche se l'operazione è stata completata correttamente. Ad esempio, una risposta riuscita da un server potrebbe essere stata ritardata abbastanza a lungo da far scadere il termine. Riprova con il backoff esponenziale.
5 NOT_FOUND Alcune entità richieste, ad esempio una risorsa FHIR, non sono state trovate. Non riprovare senza risolvere il problema.
6 ALREADY_EXISTS L'entità che un client ha tentato di creare, ad esempio un'istanza DICOM, esiste già. Non riprovare senza risolvere il problema.
7 PERMISSION_DENIED Il chiamante non dispone dell'autorizzazione per eseguire l'operazione specificata. Questo codice di errore non implica che la richiesta sia valida, che l'entità richiesta esista o che soddisfi altre precondizioni. Non riprovare senza risolvere il problema.
8 RESOURCE_EXHAUSTED Alcune risorse sono esaurite, ad esempio una quota per progetto. Riprova con il backoff esponenziale. La quota potrebbe diventare disponibile nel tempo.
9 FAILED_PRECONDITION L'operazione è stata rifiutata perché il sistema non si trova nello stato richiesto per l'esecuzione dell'operazione. Ad esempio, la directory da eliminare non è vuota o un'operazione rmdir viene applicata a un elemento non di tipo directory. Non riprovare senza risolvere il problema.
10 ABORTED L'operazione è stata interrotta, in genere a causa di un problema di concorrenza, ad esempio un errore di controllo del sequencer o un'interruzione della transazione. Riprova con il backoff esponenziale.
11 OUT_OF_RANGE L'operazione è stata tentata oltre l'intervallo valido, ad esempio la ricerca o la lettura oltre la fine del file. A differenza di INVALID_ARGUMENT, questo errore indica un problema che potrebbe essere risolto se lo stato del sistema cambia. Non riprovare senza risolvere il problema.
12 UNIMPLEMENTED L'operazione non è implementata o non è supportata/abilitata nell'API Drive. Non riprovare.
13 INTERNAL Errori interni. Ciò indica che si è verificato un errore imprevisto durante l'elaborazione nel sistema sottostante. Riprova con il backoff esponenziale.
14 UNAVAILABLE L'API Drive non è disponibile. Si tratta molto probabilmente di una condizione temporanea, che può essere corretta riprovando con un backoff esponenziale. Tieni presente che non è sempre sicuro riprovare le operazioni non idempotenti. Riprova con il backoff esponenziale.
15 DATA_LOSS Perdita o danneggiamento dei dati non recuperabili. Rivolgiti al tuo amministratore di sistema. L'amministratore di sistema potrebbe voler contattare un rappresentante dell'assistenza in caso di perdita o danneggiamento dei dati.
16 UNAUTHENTICATED La richiesta non ha credenziali di autenticazione valide per l'operazione. Non riprovare senza risolvere il problema.