Zarządzaj długo trwającymi operacjami

Długo trwająca operacja (LRO) to metoda interfejsu API, której wykonanie trwa dłużej niż jest to odpowiednie w przypadku odpowiedzi interfejsu API. Zwykle nie chcesz, aby wątek wywołujący był otwarty podczas wykonywania zadania, ponieważ pogarsza to wrażenia użytkownika. Zamiast tego lepiej zwrócić użytkownikowi obietnicę i umożliwić mu sprawdzenie stanu później.

Interfejs Google Drive API zwraca LRO za każdym razem, gdy wywołujesz metodę download w zasobie files, aby pobrać zawartość pliku za pomocą interfejsu Drive API lub jego bibliotek klienta.

Metoda zwraca klientowi zasób operations. Za pomocą zasobu operations możesz asynchronicznie pobierać stan metody interfejsu API, sprawdzając operację za pomocą metody get. Operacje LRO w interfejsie Drive API są zgodne z wzorcem projektowania operacji LRO w Google Cloud.

Więcej informacji znajdziesz w artykule Operacje długotrwałe.

Omówienie procesu

Na diagramie poniżej widać ogólne kroki działania metody file.download.

Najważniejsze kroki metody file.download.
Rysunek 1. Najważniejsze kroki metody file.download.

  1. Wywołanie files.download: gdy aplikacja wywołuje metodę download, wysyła żądanie pobrania pliku z interfejsu Drive API. Więcej informacji znajdziesz w artykule Pobieranie plików.

  2. Żądanie uprawnień: żądanie wysyła dane uwierzytelniające do interfejsu Drive API. Jeśli aplikacja wymaga wywoływania interfejsu Drive API przy użyciu uwierzytelniania użytkownika, które nie zostało jeszcze przyznane, wyświetla prośbę o zalogowanie się. Aplikacja prosi też o dostęp z zakresami, które określasz podczas konfigurowania uwierzytelniania.

  3. Rozpocznij pobieranie: wysyłane jest żądanie do interfejsu Drive API, aby rozpocząć pobieranie pliku. Prośba może dotyczyć Google Vids lub innych treści Google Workspace.

  4. Uruchomienie LRO: rozpoczyna się długo trwająca operacja, która zarządza procesem pobierania.

  5. Zwróć oczekującą operację: interfejs Drive API zwraca oczekującą operację zawierającą informacje o użytkowniku wysyłającym żądanie i kilka pól metadanych pliku.

  6. Początkowy stan oczekiwania: aplikacja otrzymuje operację oczekującą wraz z początkowym stanem oczekiwania done=null. Oznacza to, że plik nie jest jeszcze gotowy do pobrania, a stan operacji to oczekiwanie.

  7. Wywołaj operations.get i sprawdź wynik: aplikacja wywołuje get w zalecanych odstępach czasu, aby sprawdzać wynik operacji i pobierać najnowszy stan długo trwającej operacji. Jeśli zwrócony zostanie stan oczekiwania done=false, aplikacja musi kontynuować sondowanie, dopóki operacja nie zwróci stanu ukończenia (done=true). W przypadku dużych plików sondowanie może być konieczne wielokrotnie. Więcej informacji znajdziesz w artykule Uzyskiwanie szczegółów długotrwałej operacji.

  8. Sprawdź stan oczekiwania: jeśli z długotrwałej operacji zostanie zwrócony stan oczekiwania done=true, oznacza to, że plik jest gotowy do pobrania, a stan operacji to „ukończono”.

  9. Zwróć ukończoną operację z identyfikatorem URI pobierania: po zakończeniu długo trwającej operacji interfejs Drive API zwraca identyfikator URI pobierania, a plik jest teraz dostępny dla użytkownika.

Pobieranie plików

Aby pobrać treści w ramach długotrwałej operacji, użyj metody download w zasobie files. Metoda przyjmuje parametry file_id, mime_typerevision_id:

  • Wymagane. Parametr ścieżki file_id to identyfikator pliku do pobrania.

  • Opcjonalnie. Parametr zapytania mime_type oznacza typ MIME, którego powinna używać metoda. Jest ona dostępna tylko podczas pobierania treści multimedialnych innych niż blob (np. dokumentów Google Workspace). Pełną listę obsługiwanych typów MIME znajdziesz w artykule Eksportowanie typów MIME w dokumentach Google Workspace.

    Jeśli typ MIME nie jest ustawiony, dokument Google Workspace zostanie pobrany z domyślnym typem MIME. Więcej informacji znajdziesz w artykule Domyślne typy MIME.

  • Opcjonalnie. Parametr zapytania revision_id to identyfikator wersji pliku do pobrania. Jest dostępna tylko podczas pobierania plików binarnych, Dokumentów Google i Arkuszy Google. Zwraca kod błędu INVALID_ARGUMENT podczas pobierania konkretnej wersji w przypadku nieobsługiwanych plików.

Metoda download to jedyny sposób na pobieranie plików Vids w formacie MP4. Zwykle najlepiej sprawdza się w przypadku pobierania większości plików wideo.

Linki pobierania wygenerowane początkowo dla Dokumentów lub Arkuszy Google zwracają przekierowanie. Kliknij nowy link, aby pobrać plik.

Żądanie metody download, która rozpoczyna LRO, oraz żądanie pobrania końcowego identyfikatora URI pobierania powinny używać kluczy zasobów. Więcej informacji znajdziesz w artykule Dostęp do plików na Dysku udostępnionych za pomocą linku przy użyciu kluczy zasobów.

Protokół żądania jest widoczny tutaj.

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

Zastąp FILE_ID fileId pliku, który chcesz pobrać.

Domyślne typy MIME

Jeśli podczas pobierania treści innych niż obiekty blob nie ustawisz typu MIME, zostaną przypisane te domyślne typy MIME:

Typ dokumentu Format typ MIME Rozszerzenie pliku
Google Apps Script JSON application/vnd.google-apps.script+json .json
Dokumenty Google Microsoft Word application/vnd.openxmlformats-officedocument.wordprocessingml.document .docx
Rysunki Google PNG image/png .png
Formularze Google Kod pocztowy application/zip .zip
Arkusze Google Microsoft Excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .xlsx
Witryny Google Zwykły tekst text/raw .txt
Prezentacje Google Microsoft PowerPoint application/vnd.openxmlformats-officedocument.presentationml.presentation .pptx
Google Vids MP4 application/mp4 .mp4
Jamboard PDF application/pdf .pdf

Pobieranie odpowiedzi

Podczas wywoływania metody download treść odpowiedzi składa się z zasobu reprezentującego długotrwałą operację. Metoda zwykle zwraca link do pobrania zawartości pliku.

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

Dane wyjściowe zawierają te wartości:

Pamiętaj, że pole partialDownloadAllowed określa, czy dozwolone jest częściowe pobieranie, i ma wartość true podczas pobierania zawartości pliku binarnego.

Sprawdzanie szczegółów długo trwającej operacji

Długotrwałe operacje to wywołania metod, których wykonanie może zająć dużo czasu. Zwykle nowo utworzone operacje pobierania są początkowo zwracane w stanie oczekiwania (done=null), zwłaszcza w przypadku plików Vids.

Aby sprawdzić stan przetwarzania LRO, możesz użyć zasobu operations udostępnianego przez interfejs Drive API. Wystarczy, że podasz unikalną nazwę przypisaną przez serwer.

Metoda get asynchronicznie pobiera najnowszy stan długo trwającej operacji. Klienci mogą używać tej metody do sprawdzania wyniku operacji w interwałach zalecanych przez usługę API.

Pobieranie informacji o długo trwającej operacji

Aby sondować dostępną operację LRO, wielokrotnie wywołuj metodę get, aż operacja się zakończy. Między kolejnymi żądaniami sprawdzania używaj wzrastającego czasu do ponowienia, np. 10 sekund.

Długotrwała operacja pozostaje dostępna przez co najmniej 12 godzin, ale w niektórych przypadkach może być dostępna dłużej. Ten czas może ulec zmianie i może się różnić w zależności od typu pliku. Gdy zasób wygaśnie, konieczne będzie przesłanie nowej prośby o zastosowanie metody download.

Wszystkie żądania wysyłane do get powinny używać kluczy zasobów. Więcej informacji znajdziesz w artykule Dostęp do plików na Dysku udostępnionych za pomocą linku przy użyciu kluczy zasobów.

Protokoły żądań są widoczne tutaj.

Wywołanie metody

operations.get(name='NAME');

Zastąp NAME nazwą operacji przypisaną przez serwer, która jest widoczna w odpowiedzi na żądanie metody download.

curl

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

Zastąp NAME nazwą operacji przypisaną przez serwer, która jest widoczna w odpowiedzi na żądanie metody download.

Polecenie używa ścieżki /drive/v3/operations/NAME.

Pamiętaj, że wartość name jest zwracana tylko w odpowiedzi na żądanie download. Nie ma innego sposobu na jego pobranie, ponieważ interfejs Drive API nie obsługuje metody list. Jeśli wartość name zostanie utracona, musisz wygenerować nową odpowiedź, ponownie wywołując żądanie metody download.

Odpowiedź na żądanie get składa się z zasobu reprezentującego długo trwającą operację. Więcej informacji znajdziesz w sekcji Pobieranie odpowiedzi.

Gdy odpowiedź zawiera stan ukończenia (done=true), oznacza to, że długo trwająca operacja została zakończona.

Pobieranie wersji

Aby pobrać najnowszą wersję, możesz użyć wartości pola headRevisionId z zasobu files. Spowoduje to pobranie wersji odpowiadającej metadanym pliku, który został wcześniej pobrany. Aby pobrać dane wszystkich poprzednich wersji pliku, które są nadal przechowywane w chmurze, możesz wywołać metodę list w zasobie revisions z parametrem fileId. Zwraca wszystkie revisionIds w pliku.

Aby pobrać treść wersji plików binarnych, musisz wywołać metodę get w zasobie revisions z identyfikatorem pliku do pobrania, identyfikatorem wersji i parametrem adresu URL alt=media. Parametr URL alt=media informuje serwer, że pobieranie treści jest żądane jako alternatywny format odpowiedzi.

Wersji plików z Dokumentów, Arkuszy, Prezentacji i Vids Google nie można pobrać za pomocą metody get z adresem URL alt=media. W przeciwnym razie generuje błąd fileNotDownloadable.

Parametr adresu URL alt=media to parametr systemowy dostępny we wszystkich interfejsach API REST Google. Jeśli używasz biblioteki klienta interfejsu Drive API, nie musisz jawnie ustawiać tego parametru.

Protokół żądania jest widoczny tutaj.

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

Zastąp następujące elementy:

  • FILE_ID: fileId pliku, który chcesz pobrać.
  • REVISION_ID: revisionId wersji, którą chcesz pobrać.

W Dokumentach, Rysunkach i Prezentacjach Google numery wersji są zwiększane automatycznie. Jeśli jednak usuniesz wersje, w serii numerów mogą pojawić się luki, więc nie możesz polegać na kolejnych numerach, aby pobrać wersje.

Rozwiązywanie problemów z LRO

Gdy LRO zakończy się niepowodzeniem, w odpowiedzi pojawi się kanoniczny kod błędu Google Cloud.

W tabeli poniżej znajdziesz poszczególne kody błędów, odpowiadające im kody stanu HTTP, opis oraz zalecenia dotyczące obsługi kodu błędu. W przypadku wielu błędów zalecane działanie to ponowienie próby wysłania żądania przy użyciu wzrastającego czasu do ponowienia.

Więcej informacji o tym modelu błędów i sposobie pracy z nim znajdziesz w przewodniku API Design Guide.

Kod Typ wyliczeniowy Kod stanu HTTP Opis Zalecane działanie
1 CANCELLED 499 Client Closed Request Operacja została anulowana, zwykle przez element wywołujący. Uruchom operację ponownie.
2 UNKNOWN 500 Internal Server Error Ten błąd może być zwracany, gdy wartość Status otrzymana z innej przestrzeni adresowej należy do przestrzeni błędów, która nie jest znana w tej przestrzeni adresowej. Jeśli błąd interfejsu API nie zwraca wystarczającej ilości informacji, może zostać przekształcony w ten błąd. Ponów próbę ze wzrastającym czasem do ponowienia.
3 INVALID_ARGUMENT 400 Bad Request Klient podał nieprawidłowy argument. Ten błąd różni się od błędu FAILED_PRECONDITION. INVALID_ARGUMENT oznacza argumenty, które są problematyczne niezależnie od stanu systemu, np. nieprawidłowo sformatowaną nazwę pliku. Nie próbuj ponownie bez rozwiązania problemu.
4 DEADLINE_EXCEEDED 504 Gateway Timeout Termin upłynął przed wykonaniem operacji. W przypadku operacji, które zmieniają stan systemu, ten błąd może zostać zwrócony nawet wówczas, gdy operacja zakończyła się pomyślnie. Na przykład pomyślna odpowiedź serwera mogła być tak opóźniona, że termin upłynął. Ponów próbę ze wzrastającym czasem do ponowienia.
5 NOT_FOUND 404 Not Found Nie znaleziono żądanego elementu, np. zasobu FHIR. Nie próbuj ponownie bez rozwiązania problemu.
6 ALREADY_EXISTS 409 Conflict Encja, którą próbował utworzyć klient, np. instancja DICOM, już istnieje. Nie próbuj ponownie bez rozwiązania problemu.
7 PERMISSION_DENIED 403 Forbidden Element wywołujący nie ma uprawnień do wykonania określonej operacji. Ten kod błędu nie oznacza, że żądanie jest prawidłowe, żądany podmiot istnieje lub spełnia inne warunki wstępne. Nie próbuj ponownie bez rozwiązania problemu.
8 RESOURCE_EXHAUSTED 429 Too Many Requests Został wyczerpany jeden z zasobów, np. limit na projekt. Ponów próbę ze wzrastającym czasem do ponowienia. Limit może być dostępny z czasem.
9 FAILED_PRECONDITION 400 Bad Request Operacja została odrzucona, ponieważ system nie znajduje się w stanie wymaganym do jej wykonania. Na przykład katalog do usunięcia nie jest pusty lub operacja rmdir jest stosowana do elementu, który nie jest katalogiem. Nie próbuj ponownie bez rozwiązania problemu.
10 ABORTED 409 Conflict Operacja została przerwana, najczęściej z powodu problemu równoczesności, np. w przypadku nieudanej kontroli sekwencera lub przerwanej transakcji. Ponów próbę ze wzrastającym czasem do ponowienia.
11 OUT_OF_RANGE 400 Bad Request Operacja została podjęta poza prawidłowym zakresem, np. wyszukiwanie lub odczytywanie poza końcem pliku. W przeciwieństwie do błędu INVALID_ARGUMENT ten błąd wskazuje na problem, który można rozwiązać, jeśli zmieni się stan systemu. Nie próbuj ponownie bez rozwiązania problemu.
12 UNIMPLEMENTED 501 Not Implemented Operacja nie jest zaimplementowana lub nie jest obsługiwana/włączona w interfejsie Drive API. Nie próbuj ponownie.
13 INTERNAL 500 Internal Server Error Błędy wewnętrzne. Oznacza to, że podczas przetwarzania w systemie bazowym wystąpił nieoczekiwany błąd. Ponów próbę ze wzrastającym czasem do ponowienia.
14 UNAVAILABLE 503 Service Unavailable Interfejs Drive API jest niedostępny. Jest to najczęściej stan przejściowy, który można rozwiązać, ponawiając próbę ze wzrastającym czasem do ponowienia. Pamiętaj, że ponawianie operacji nieidempotentnych nie zawsze jest bezpieczne. Ponów próbę ze wzrastającym czasem do ponowienia.
15 DATA_LOSS 500 Internal Server Error Nieodwracalna utrata lub uszkodzenie danych. Skontaktuj się z administratorem systemu. Jeśli doszło do utraty lub uszkodzenia danych, administrator systemu może skontaktować się z przedstawicielem zespołu pomocy.
16 UNAUTHENTICATED 401 Unauthorized Żądanie nie ma prawidłowych danych uwierzytelniających dla tej operacji. Nie próbuj ponownie bez rozwiązania problemu.