長時間実行オペレーションを管理する

長時間実行オペレーション(LRO)は、API レスポンスに適した時間よりも完了に時間がかかる API メソッドです。通常、タスクの実行中に呼び出しスレッドを開いたままにすると、ユーザー エクスペリエンスが低下するため、避けるべきです。代わりに、ユーザーに何らかの Promise を返し、後で確認できるようにすることをおすすめします。

Google Drive API は、files リソースで download メソッドを呼び出して、Drive API またはそのクライアント ライブラリを介してファイルの内容をダウンロードするたびに、LRO を返します。

このメソッドは、クライアントに operations リソースを返します。operations リソースを使用すると、get メソッドでオペレーションをポーリングして、API メソッドのステータスを非同期で取得できます。Drive API の LRO は、 Google Cloud LRO 設計パターンに準拠しています。

詳細については、長時間実行オペレーションをご覧ください。

プロセスの概要

次の図は、file.download メソッドの仕組みの概要を示しています。

file.download メソッドの大まかな手順。
図 1. file.download メソッドの手順の概要。

  1. files.download を呼び出す: アプリが download メソッドを呼び出すと、そのファイルの Drive API ダウンロード リクエストが開始されます。詳しくは、ファイルをダウンロードするをご覧ください。

  2. 権限をリクエストする: リクエストは認証情報を Drive API に送信します。アプリで、まだ付与されていないユーザーの認証を使用して Drive API を呼び出す必要がある場合、ユーザーにログインを求めるメッセージが表示されます。アプリは、認証の設定時に指定したスコープを使用してアクセスを要求します。

  3. ダウンロードを開始: ファイルのダウンロードを開始するために、Drive API リクエストが作成されます。リクエストは Google Vids または他の Google Workspace コンテンツに対して行われる可能性があります。

  4. LRO を開始: 長時間実行オペレーションが開始され、ダウンロード プロセスが管理されます。

  5. 保留中のオペレーションを返す: Drive API は、リクエストを行うユーザーに関する情報と複数のファイル メタデータ フィールドを含む保留中のオペレーションを返します。

  6. 初期保留状態: アプリは、保留中のオペレーションと、done=null の初期保留状態を受け取ります。これは、ファイルがまだダウンロードの準備ができておらず、オペレーションのステータスが保留中であることを示します。

  7. operations.get を呼び出して結果を確認する: アプリは推奨される間隔で get を呼び出して、オペレーションの結果をポーリングし、長時間実行オペレーションの最新の状態を取得します。done=false の保留状態が返された場合、アプリはオペレーションが完了状態(done=true)を返すまでポーリングを続ける必要があります。大きなファイルの場合は、複数回のポーリングが想定されます。詳細については、長時間実行オペレーションの詳細を取得するをご覧ください。

  8. 保留中の状態を確認する: LRO から done=true の保留中の状態が返された場合、これはファイルがダウンロードの準備ができており、オペレーション ステータスが完了していることを示します。

  9. ダウンロード URI を含む完了したオペレーションを返す: LRO が完了すると、Drive API はダウンロード URI を返し、ユーザーがファイルを利用できるようになります。

ファイルをダウンロードする

長時間実行オペレーションでコンテンツをダウンロードするには、files リソースで download メソッドを使用します。このメソッドは、file_idmime_typerevision_id のクエリ パラメータを受け取ります。

  • 必須。file_id クエリ パラメータは、ダウンロードするファイルの ID です。

  • 省略可。mime_type クエリ パラメータは、メソッドが使用する MIME タイプを示します。これは、非 BLOB メディア コンテンツ(Google Workspace ドキュメントなど)をダウンロードする場合にのみ使用できます。サポートされている MIME タイプの完全なリストについては、Google Workspace ドキュメントのエクスポート MIME タイプをご覧ください。

    MIME タイプが設定されていない場合、Google Workspace ドキュメントはデフォルトの MIME タイプでダウンロードされます。詳細については、デフォルトの MIME タイプをご覧ください。

  • 省略可。revision_id クエリ パラメータは、ダウンロードするファイルのリビジョン ID です。この機能は、BLOB ファイル、Google ドキュメント、Google スプレッドシートをダウンロードする場合にのみ使用できます。サポートされていないファイルで特定のリビジョンをダウンロードすると、エラーコード INVALID_ARGUMENT を返します。

download メソッドは、Vids ファイルを MP4 形式でダウンロードする唯一の方法であり、通常はほとんどの動画ファイルのダウンロードに最適です。

Google ドキュメントまたはスプレッドシート用に最初に生成されたダウンロード リンクは、リダイレクトを返します。新しいリンクをクリックしてファイルをダウンロードします。

LRO を開始する download メソッドへのリクエストと、最終的なダウンロード URI を取得するリクエストの両方で、リソースキーを使用する必要があります。詳しくは、リソースキーを使用してリンク共有されたドライブ ファイルにアクセスするをご覧ください。

リクエスト プロトコルがここに表示されます。

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

FILE_ID は、ダウンロードするファイルの fileId に置き換えます。

デフォルトの MIME タイプ

blob 以外のコンテンツをダウンロードするときに MIME タイプが設定されていない場合は、次のデフォルトの MIME タイプが割り当てられます。

ドキュメントの種類 形式 MIME タイプ ファイル拡張子
Google Apps Script JSON application/vnd.google-apps.script+json .json
Google ドキュメント Microsoft Word application/vnd.openxmlformats-officedocument.wordprocessingml.document .docx
Google 図形描画 PNG image/png .png
Google フォーム ZIP application/zip .zip
Google スプレッドシート Microsoft Excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .xlsx
Google サイト Raw Text text/raw .txt
Google スライド Microsoft PowerPoint application/vnd.openxmlformats-officedocument.presentationml.presentation .pptx
Google Vids MP4 application/mp4 .mp4
Jamboard PDF application/pdf .pdf

ダウンロード レスポンス

download メソッドを呼び出すと、レスポンス本文は、長時間実行オペレーションを表すリソースで構成されます。通常、このメソッドはファイルの内容をダウンロードするためのリンクを返します。

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

この出力には次の値が含まれます。

partialDownloadAllowed フィールドは、部分ダウンロードが許可されているかどうかを示します。BLOB ファイルのコンテンツをダウンロードする場合は true。

長時間実行オペレーションの詳細を取得する

長時間実行オペレーションとは、完了までに膨大な時間がかかる可能性があるメソッドの呼び出しです。通常、新しく作成されたダウンロード オペレーションは、特に Google Vids ファイルの場合、最初は保留状態(done=null)で返されます。

Drive API が提供する operations リソースを使用して、サーバー割り当ての一意の名前を含めることで、処理 LRO のステータスを確認できます。

get メソッドは、長時間実行オペレーションの最新の状態を非同期で取得します。クライアントはこのメソッドを使用して、API サービスで推奨される間隔でオペレーションの結果をポーリングできます。

長時間実行オペレーションをポーリングする

使用可能な LRO をポーリングするには、オペレーションが完了するまで get メソッドを繰り返し呼び出します。各ポーリング リクエスト間で指数バックオフ(たとえば、10 秒)を使用します。

LRO は最低 12 時間使用できますが、場合によってはそれ以上存続することもあります。この期間は変更される可能性があり、ファイル形式によって異なる場合があります。リソースの有効期限が切れた場合は、新しい download メソッド リクエストが必要です。

get へのリクエストでは、リソースキーを使用する必要があります。詳しくは、リソースキーを使用してリンク共有されたドライブ ファイルにアクセスするをご覧ください。

リクエスト プロトコルがここに表示されます。

メソッド呼び出し

operations.get(name='NAME');

NAME は、download メソッド リクエストのレスポンスに示されているオペレーションのサーバー割り当て名に置き換えます。

curl

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

NAME は、download メソッド リクエストのレスポンスに示されているオペレーションのサーバー割り当て名に置き換えます。

このコマンドではパス /drive/v3/operations/NAME を使用します。

name は、download リクエストに対するレスポンスでのみ返されます。Drive API は List メソッドをサポートしていないため、この方法以外で取得することはできません。name の値が失われた場合は、download メソッド リクエストを再度呼び出して新しいレスポンスを生成する必要があります。

get リクエストからのレスポンスは、長時間実行オペレーションを表すリソースで構成されます。詳細については、ダウンロード レスポンスをご覧ください。

レスポンスに完了状態(done=true)が含まれている場合、長時間実行オペレーションは終了しています。

リビジョンをダウンロードする

files リソースの headRevisionId フィールドの値を使用して、最新のリビジョンをダウンロードできます。これにより、以前に取得したファイルのメタデータに対応するリビジョンが取得されます。クラウドにまだ保存されているファイルの以前のすべてのリビジョンのデータをダウンロードするには、fileId パラメータを使用して revisions リソースで list メソッドを呼び出します。これにより、ファイル内のすべての revisionIds が返されます。

BLOB ファイルの改訂コンテンツをダウンロードするには、ダウンロードするファイルの ID、改訂の ID、alt=media URL パラメータを指定して、revisions リソースで get メソッドを呼び出す必要があります。alt=media URL パラメータは、代替レスポンス形式としてコンテンツのダウンロードがリクエストされていることをサーバーに伝えます。

alt=media URL で get メソッドを使用しても、Google ドキュメント、スプレッドシート、スライド、Vids のリビジョンをダウンロードすることはできません。それ以外の場合は、fileNotDownloadable エラーが生成されます。

alt=media URL パラメータは、すべての Google REST API で使用できるシステム パラメータです。Drive API のクライアント ライブラリを使用する場合は、このパラメータを明示的に設定する必要はありません。

リクエスト プロトコルがここに表示されます。

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

次のように置き換えます。

  • FILE_ID: ダウンロードするファイルの fileId
  • REVISION_ID: ダウンロードするリビジョンの revisionId

Google ドキュメント、図形描画、スライドの版は、版番号が自動的に増分されます。ただし、リビジョンが削除されると、番号のシーケンスにギャップが生じる可能性があるため、連続した番号を使用してリビジョンを取得することは避けてください。

LRO のトラブルシューティング

LRO が失敗すると、レスポンスに正規の Google Cloud エラーコードが含まれます。

次の表に、各コードの原因と、コードの処理方法に関する推奨事項を示します。多くのエラーでは、指数バックオフを使用してリクエストを再試行することをおすすめします。

このエラーモデルとその処理方法について詳しくは、API 設計ガイドをご覧ください。

コード 列挙型 説明 推奨される対処方法
1 CANCELLED オペレーションがキャンセルされました。通常、キャンセルは呼び出し元により行われます。 オペレーションを再実行します。
2 UNKNOWN 別のアドレス空間から受信した Status 値がこのアドレス空間で不明なエラー空間に属している場合に、このエラーが返される可能性があります。API エラーから十分な情報が返されない場合、エラーがこのエラーに変換されている可能性があります。 指数バックオフを使用して再試行する。
3 INVALID_ARGUMENT クライアントが無効な引数を指定しました。このエラーは FAILED_PRECONDITION とは異なります。INVALID_ARGUMENT は、ファイル名の形式が不適切など、システムの状態を問わず問題がある引数を示します。 問題を解決してから再試行します。
4 DEADLINE_EXCEEDED オペレーションが完了する前に期限が切れました。システムの状態を変更するオペレーションの場合、オペレーションが正常に終了しても、このエラーが返されることがあります。たとえば、サーバーからの正常なレスポンスが期限切れになるほど遅延する場合もあります。 指数バックオフを使用して再試行します。
5 NOT_FOUND リクエストされたエンティティ(FHIR リソースなど)が見つかりませんでした。 問題を解決してから再試行します。
6 ALREADY_EXISTS クライアントが作成しようとしたエンティティ(DICOM インスタンスなど)はすでに存在します。 問題を解決してから再試行します。
7 PERMISSION_DENIED 呼び出し元には、指定されたオペレーションを実行する権限がありません。このエラーコードは、リクエストが有効であること、リクエストされたエンティティが存在すること、および他の事前条件が満たされていることを意味するものではありません。 問題を解決してから再試行します。
8 RESOURCE_EXHAUSTED プロジェクトごとの割り当てなど、一部のリソースが枯渇しています。 指数バックオフを使用して再試行します。割り当ては時間の経過とともに使用可能になることがあります。
9 FAILED_PRECONDITION システムがオペレーションの実行に必要な状態ではないため、オペレーションが拒否されました。たとえば、削除されるディレクトリが空でない、rmdir オペレーションがディレクトリ以外に適用されている状態です。 問題を解決してから再試行します。
10 ABORTED オペレーションは、通常、シーケンサー チェックの失敗、またはトランザクションの中止などの同時実行の問題のために中止されています。 指数バックオフを使用して再試行します。
11 OUT_OF_RANGE オペレーションが、ファイルの終わりを超えたシークまたは読み取りなど、有効な範囲を超えて試行されました。INVALID_ARGUMENT とは異なり、このエラーは、システムの状態が変化すれば修正できる可能性のある問題を示しています。 問題を解決してから再試行します。
12 UNIMPLEMENTED オペレーションが実装されていないか、Drive API でサポートされていないか、有効にされていません。 再試行しないでください。
13 INTERNAL 内部エラー。これは、基盤となるシステムで処理中に予期しないエラーが発生したことを示します。 指数バックオフを使用して再試行します。
14 UNAVAILABLE ドライブ API が利用できません。これは、指数バックオフで再試行することで解決できる可能性が高い一時的な状態です。非べき等オペレーションの再試行が常に安全であるとは限りません。 指数バックオフを使用して再試行する。
15 DATA_LOSS 回復不能なデータの消失や破損。 システム管理者にお問い合わせください。データの損失や破損が発生した場合は、システム管理者からサポート担当者に連絡することをおすすめします。
16 UNAUTHENTICATED リクエストには、オペレーションのための有効な認証情報がありません。 問題を解決してから再試行します。