Googleドライブは、Googleアカウントさえあれば誰でも利用できるサービスです。通常のGoogleアカウントユーザであれば15GBが無料で利用でき、追加料金の支払い、例えば月に1300円払えば1TBのストレージを利用することができます。さらに、GSuite Businessを利用する場合はユーザ当たり月1200円を支払えば無制限のストレージを利用することができます(5アカウント以下の場合はユーザ当たり1TBの容量制限あり)。
また、Googleは(Google Driveに限らずですが)、REST APIとそれをラップした言語別のSDKを公開しているため、ユーザはそれぞれの要件に合ったGoogle Driveを基盤とするサービスを構築することも可能です。
Google Drive APIは現在v3が最新バージョンとなりますが、deprecateの告知がないため現在もv2を利用しているサービスも多いのではないでしょうか。
今回のapps-gcpは、Google Drive APIをv2からv3へマイグレーションする場合の注意点をまとめた記事となります!!
まだv3に移行していない方はこの記事をぜひ参考にしてください!
目次
(1)リソースは「fields」パラメータで指定しないと取得できない
v3からはREST APIのFiles:getメソッドでフルリソースを取得することができなくなりました。どういうことかと言うと、例えば以下のようなDriveのFileオブジェクトを取得するようなコードをJava用のクライアントライブラリを利用して実装したとします。
※1 クライアントライブラリでファイルをGETで取得する実装は「service.files().get(id).execute()」の部分です。
public File getFile(Drive service, String id) throws IOException {
return service.files().get(id).execute();
}
上記コードに対して以下のテストコードはv2では通るのですが、v3では通りません。それは「field」パラメータでmimeTypeを指定していないからです。
@Test
public void テストしてみる() throws IOException, RetryExceededException {
assertNotNull(getFile(service, id).getMimeType());
}
v3でテストを通す場合は、以下のように修正します。setFields(“id, name, mimeType”)が修正点となります。
この修正によって、レスポンスとしてmimeTypeが取得できるようになるため、先ほどのテストも通るようになります。
※2 その他リソースも必要な場合はカンマ区切りでリソースを並べます。
public File getFile(Drive service, String id) throws IOException {
return service.files().get(id).setFields("id, name, mimeType").execute();
}
(2)ファイル名称のフィールドが「title」から「name」に変更になった
Fileクラスのファイル名称のフィールド名がv3から変更になりました。この変更はSDKのバージョンをアップデートした時にIDEが検知してくれるので修正は難しくないと思います。1点注意が必要な箇所があるとすると、それはDrive検索のクエリにフィールド名をハードコードしているケースです。
以下はファイル名からGoogle Drive上のファイルを検索するためのコードですが、もちろんフィールド名が異なるのでv2では動作しますがv3では動作しないコードになります。
public FileList getFiles(Drive service, String title) throws IOException {
return service.files().list().setQ("title = " + title).execute();
}
v3で動作させるためには以下のようにコードを修正します。
public FileList getFiles(Drive service, String name) throws IOException {
return service.files().list().setQ("name = " + name).execute();
}
このように検索フィールドをハードコードしている場合は注意が必要です。
(3)親のIDにはString型のリストを設定する
「親」とはGoogle Driveのフォルダを意味し、ファイルに対して親は複数持つことができます。
親の設定はv2までは以下のように実装します。ParentReferenceのリストをFileオブジェクトのParentsフィールドにセットしています。
ParentReference pr = new ParentReference();
pr.setId(folderId);
file.setParents(Arrays.asList(pr));
file.setParents(Arrays.asList(“親のID文字列”));
(4)ファイルの実データはexecuteMediaメソッドで取得する
v2まではFileオブジェクトのdownloadUrlを利用して実ファイルの取得を行っていました。v3ではFileオブジェクトからdownloadUrlフィールドが削除されたため、別の方法でファイルのダウンロードをおこなう必要があります。
public InputStream getFileContent(Drive service, String fileId) throws IOException {
File file = service.files().get(fileId).execute();
HttpResponse resp = service.getRequestFactory().buildGetRequest(new
GenericUrl(file.getDownloadUrl())).execute();
return resp.getContent();
}
v3でファイルをダウンロードするコードは以下の通りです。ファイルのメタ情報と同様GETのAPIを利用しますが、実データを取得する場合はaltフィールドに「media」を文字列をセットした上で、executeMediaメソッドでAPIを実行します。
public InputStream getFileContent(Drive service, String fileId) throws IOException, RetryExceededException {
HttpResponse resp = service.files().get(fileId).setAlt("media").executeMedia();
return resp.getContent();
}
まとめ
v2からv3へのマイグレーション対応は、単純に一つ一つチェックするのは非常に大変な作業ですが、テストケースさえ網羅されていれば、後はSDKをアップデートしてテストが通るまでリファクタリングを行うだけの単純作業です。この作業を簡易化するために必ずテストを書くことを心がけましょう。
クラウドエースと吉積情報は、GCPだけでなく、Google DriveのようなG Suiteサービスを利用したシステム開発も得意とする開発会社です。G SuiteやGCPについてご相談がある場合は以下URLから問い合わせをおこなってください。