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 komfort użytkowania. Zamiast tego lepiej jest zwrócić użytkownikowi obietnicę i pozwolić mu na sprawdzenie stanu później.
Interfejs Google Drive API zwraca LRO za każdym razem, gdy wywołasz metodę download w zasobie
files, aby pobrać zawartość pliku
za pomocą interfejsu Drive API lub jego bibliotek
klienckich.
Metoda zwraca klientowi zasób operations. Za pomocą zasobu operations możesz asynchronicznie pobierać
stan metody interfejsu API, sprawdzając stan operacji za pomocą metody get. LRO w interfejsie Drive API są zgodne ze
wzorcem projektowym LRO Google Cloud
.
Więcej informacji znajdziesz w artykule Długo trwające operacje.
Omówienie procesu
Poniższy schemat przedstawia najważniejsze kroki działania metody file.download.
Wywołanie metody
files.download: gdy aplikacja wywoła metodędownload, uruchomi żądanie pobrania pliku z interfejsu Drive API. Więcej informacji znajdziesz w sekcji Pobieranie plików.Żądanie uprawnień: żądanie wysyła dane uwierzytelniające do interfejsu Drive API. Jeśli Twoja aplikacja wymaga wywołania interfejsu Drive API przy użyciu uwierzytelnienia użytkownika, które nie zostało jeszcze przyznane, wyświetli się prośba o zalogowanie. Aplikacja poprosi też o dostęp z zakresami, które określisz podczas konfigurowania uwierzytelniania.
Rozpoczęcie pobierania: wysyłane jest żądanie do interfejsu Drive API, aby rozpocząć pobieranie pliku. Żądanie może zostać wysłane do Google Vids lub innej treści Google Workspace.
Rozpoczęcie LRO: rozpoczyna się długo trwająca operacja, która zarządza procesem pobierania.
Zwrócenie operacji w stanie oczekiwania: interfejs Drive API zwraca operację w stanie oczekiwania, która zawiera informacje o użytkowniku wysyłającym żądanie oraz kilka pól metadanych pliku.
Początkowy stan oczekiwania: aplikacja otrzymuje operację w stanie oczekiwania wraz z początkowym stanem oczekiwania
done=null. Oznacza to, że plik nie jest jeszcze gotowy do pobrania, a stan operacji to „oczekiwanie”.Wywołanie metody
operations.geti sprawdzenie wyniku: aplikacja wywołuje metodęgetw zalecanych odstępach czasu, aby sprawdzić wynik operacji i uzyskać najnowszy stan długo trwającej operacji. Jeśli zostanie zwrócony stan oczekiwaniadone=false, aplikacja musi kontynuować sprawdzanie stanu, dopóki operacja nie zwróci stanu ukończenia (done=true). W przypadku dużych plików należy spodziewać się wielokrotnego sprawdzania stanu. Więcej informacji znajdziesz w sekcji Sprawdzanie szczegółów długo trwającej operacji.Sprawdzenie stanu oczekiwania: jeśli LRO zwróci stan oczekiwania
done=true, oznacza to, że plik jest gotowy do pobrania, a stan operacji to „ukończono”.Zwrócenie ukończonej operacji z identyfikatorem URI pobierania: po zakończeniu LRO 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ługo trwającej operacji, użyj metody download w zasobie
files. Metoda przyjmuje parametry file_id, mime_type i revision_id:
Wymagane. Parametr ścieżki
file_idto identyfikator pliku do pobrania.Opcjonalnie. Parametr zapytania
mime_typeokreśla typ MIME, którego powinna używać metoda. Jest dostępny tylko podczas pobierania treści multimedialnych innych niż blob (np. dokumentów Google Workspace). Pełną listę obsługiwanych typów MIME znajdziesz w sekcji Typy MIME eksportu dokumentów Google Workspace.Jeśli typ MIME nie jest ustawiony, dokument Google Workspace zostanie pobrany z domyślnym typem MIME. Więcej informacji znajdziesz w sekcji Domyślne typy MIME.
Opcjonalnie. Parametr zapytania
revision_idto identyfikator wersji pliku do pobrania. Jest dostępny tylko podczas pobierania plików blob, Dokumentów Google i Arkuszy Google. Podczas pobierania określonej wersji nieobsługiwanych plików zwraca kod błęduINVALID_ARGUMENT.
Metoda download to jedyny sposób na pobieranie plików Vids w formacie MP4. Zwykle najlepiej nadaje się do pobierania większości plików wideo. Jeśli spróbujesz wyeksportować pliki Google Vids, otrzymasz błąd
fileNotExportable.
Linki do pobierania wygenerowane dla Dokumentów lub Arkuszy Google początkowo zwracają przekierowanie. Aby pobrać plik, kliknij nowy link.
Żądanie do metody download, które rozpoczyna LRO, oraz żądanie pobrania końcowego identyfikatora URI pobierania powinny używać kluczy zasobów. Więcej informacji znajdziesz w sekcji
Uzyskiwanie dostępu 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}/downloadZastąp ciąg FILE_ID wartością fileId pliku, który chcesz
pobrać.
Domyślne typy MIME
Jeśli podczas pobierania treści innych niż blob nie jest ustawiony typ MIME, przypisywane są 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 | ZIP | 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 | video/mp4 | .mp4 |
| Jamboard | application/pdf |
Pobierz odpowiedź
Podczas wywoływania metody download treść odpowiedzi
składa się z zasobu
reprezentującego długo trwającą 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:
RESOURCE_KEY: klucz zasobu pomaga chronić plik przed nieautoryzowanym dostępem. Więcej informacji znajdziesz w sekcji Uzyskiwanie dostępu do plików na Dysku udostępnionych za pomocą linku przy użyciu kluczy zasobów.
NAME: nazwa przypisana przez serwer.
DOWNLOAD_URI: końcowy identyfikator URI pobierania pliku.
Pamiętaj, że pole partialDownloadAllowed wskazuje, czy dozwolone jest częściowe pobieranie. Ma wartość true
podczas pobierania zawartości pliku blob.
Sprawdzanie szczegółów długo trwającej operacji
Długo trwające operacje to wywołania metod, których wykonanie może zająć sporo 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, podając 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.
Sprawdzanie stanu długo trwającej operacji
Aby sprawdzić stan dostępnej LRO, wielokrotnie wywołuj metodę
get, dopóki operacja się nie zakończy.
Między kolejnymi żądaniami sprawdzania stanu używaj wzrastającego czasu do ponowienia, np. 10 sekund.
LRO 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 się zmienić i różnić w zależności od typu pliku. Po wygaśnięciu zasobu konieczne jest nowe żądanie metody download.
Wszystkie żądania get powinny używać kluczy zasobów. Więcej informacji znajdziesz w sekcji
Uzyskiwanie dostępu 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 ciąg 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 ciąg 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 name jest zwracana tylko w odpowiedzi na żądanie download.
Nie ma innego sposobu na jej 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 Pobierz
odpowiedź.
Gdy odpowiedź zawiera stan ukończenia (done=true), 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óre zostały wcześniej pobrane. 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. Spowoduje to zwrócenie wszystkich wartości revisionIds w pliku.
Aby pobrać zawartość wersji plików blob, musisz wywołać metodę get w zasobie
revisions z identyfikatorem pliku do
pobrania, identyfikatorem wersji i alt parametrem
systemowym.
Parametr alt=media informuje serwer, że żądane jest pobranie treści jako alternatywny format odpowiedzi.
Parametr systemowy alt jest dostępny we wszystkich interfejsach Google REST API. Jeśli używasz biblioteki klienta interfejsu Drive API, nie musisz jawnie ustawiać tego parametru.
Wersji Dokumentów, Arkuszy, Prezentacji i Vids Google nie można pobrać za pomocą metody get z parametrem alt=media. W przeciwnym razie generuje błąd fileNotDownloadable.
Protokół żądania jest widoczny tutaj.
GET https://www.googleapis.com/drive/v3/files/{FILE_ID}/revisions/{REVISION_ID}?alt=mediaZastąp następujące elementy:
- FILE_ID:
fileIdpliku, który chcesz pobrać. - REVISION_ID:
revisionIdwersji, którą chcesz pobrać.
Wersje Dokumentów, Rysunków i Prezentacji Google automatycznie zwiększają numery wersji. Jeśli jednak wersje zostaną usunięte, w serii liczb mogą występować luki, dlatego nie należy polegać na kolejnych numerach podczas pobierania wersji.
Rozwiązywanie problemów z LRO
Gdy LRO się nie powiedzie, odpowiedź zawiera kanoniczny kod błędu Google Cloud.
W tabeli poniżej znajdziesz każdy kod błędu, odpowiadający mu kod stanu HTTP, opis i zalecenia dotyczące obsługi kodu błędu. W przypadku wielu błędów zalecane działanie to ponowienie żądania ze wzrastającym czasem 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. | Ponownie uruchom operację. |
| 2 | UNKNOWN |
500 Internal Server Error |
Ten błąd może zostać zwrócony, 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 zawiera wystarczających informacji, może zostać przekonwertowany na 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 wskazuje argumenty, które są problematyczne niezależnie od stanu systemu, np. nieprawidłowo sformatowana nazwa pliku. |
Nie ponawiaj próby 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 ponawiaj próby bez rozwiązania problemu. |
| 6 | ALREADY_EXISTS |
409 Conflict |
Encja, którą próbował utworzyć klient, np. instancja DICOM, już istnieje. | Nie ponawiaj próby 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, żądana encja istnieje lub że spełnia inne warunki wstępne. | Nie ponawiaj próby bez rozwiązania problemu. |
| 8 | RESOURCE_EXHAUSTED |
429 Too Many Requests |
Wykorzystano jakiś zasób, 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 jest niepusty lub operacja rmdir jest stosowana do elementu, który nie jest katalogiem. |
Nie ponawiaj próby 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 |
Próba wykonania operacji została podjęta poza prawidłowym zakresem, np. podczas wyszukiwania lub odczytywania 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 ponawiaj próby bez rozwiązania problemu. |
| 12 | UNIMPLEMENTED |
501 Not Implemented |
Operacja nie jest zaimplementowana lub nie jest obsługiwana ani włączona w interfejsie Drive API. | Nie ponawiaj próby. |
| 13 | INTERNAL |
500 Internal Server Error |
Błędy wewnętrzne. Wskazuje na nieoczekiwany błąd, który wystąpił podczas przetwarzania w systemie bazowym. | 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 ponawiaj próby bez rozwiązania problemu. |